代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

stl resize()的优点

  •  2
  • whacko__Cracko  · 技术社区  · 16 年前

    这个 resize() 函数使向量包含所需数量的元素。如果我们需要的元素少于向量已经包含的元素,那么最后一个元素将被删除。如果我们要求向量增长,它将扩大其大小,并用零填充新创建的元素。

     vector<int> v(20); 
     for(int i = 0; i < 20; i++) { 
         v[i] = i+1; 
        } 
      v.resize(25); 
    
     for(int i = 20; i < 25; i++) { 
         v[i] = i*2; 
       } 
    

    但是如果我们使用 push_back() 之后 Resiz() , 它将在新分配的大小之后添加元素,但不会添加到其中。 在上面的示例中,结果向量的大小为25,而如果在第二个循环中使用push_back(),则为30。

     vector<int> v(20); 
     for(int i = 0; i < 20; i++) { 
         v[i] = i+1; 
      } 
     v.resize(25); 
      for(int i = 20; i < 25; i++) { 
      v.push_back(i*2);   // Writes to elements with indices [25..30), not [20..25) ! <
     } 
    

    那么优势在哪里呢 Resiz() 功能?它是否会造成索引和从向量访问元素的混乱?

    5 回复  |  直到 16 年前
        1
  •  6
  •   Ben S    16 年前

    听起来你应该用 vector::reserve .

    vector::resize 习惯于 初始化新创建的空间 对于给定的值(或只是默认值),函数的第二个参数是要使用的初始化值。

        2
  •  3
  •   Kornel Kisielewicz    16 年前

    记住备选方案- reserve . resize 当您想使用 [] 操作符——因此需要一个“空”的元素表。 调整大小 不用于 push_back . 使用 储备 如果要为准备数组 推挽 .

    如果数组具有有意义的“空”构造函数,那么当您可以创建一个空元素数组,并且只更改有意义的元素时,resize主要是有用的。

        3
  •  3
  •   bk1e    16 年前

    这个 resize() 方法更改向量的 size ,与向量的不同 capacity .

    理解这两个值之间的区别非常重要:

    • 这个 大小 是向量包含的实际元素数。
    • 这个 容量 是向量在不重新分配较大内存块的情况下可以包含的最大元素数。

    向量的 容量 总是大于或等于其 大小 . 向量的 容量 即使你减少了 大小 ,但有一个例外:当您使用 swap() 与另一个向量交换内容。正如其他人提到的,你可以增加一个向量的 容量 通过呼叫 reserve() .

    我认为使用正确的术语 大小 容量 使C++更容易理解 vector 讲课,讲清楚它的行为。

        4
  •  1
  •   sand    16 年前

    函数的作用是:通过插入或删除矢量中的元素来改变矢量的实际内容。它不仅改变了它的存储容量。要仅指示存储容量的更改,请改用vector::reserve。查看中的矢量可视化 link ,注意v.back指向的位置。

        5
  •  0
  •   Peter Alexander    16 年前

    我真的不理解这种困惑。的优势 resize 它会调整向量的大小。必须做一个循环 push_back S既单调又可能需要多个“实际”大小调整。

    如果要“调整”向量的大小而不更改其可访问索引,请使用 std::vector<T>::reserve .这将更改内部分配数组的大小,而不实际“添加”任何内容。