标准矢量调整大小

Max*_*rai 4 c++ resize vector std

我有一些std :: vector,我必须使用一些默认值来调整它.这是代码:

static int Counter = 0;
class Data
{
   /* ... */
   Data() { 
      Counter++; 
      std::cout << Counter << std::endl;
   }
};

std::vector<Data> mArray;

for (int i=0; i <= 200; ++i)
{
   mArray.push_back(Data());
}

// And resizing somewhere:
std::cout << "Resizing!\n";
mArray.resize(400, Data());
Run Code Online (Sandbox Code Playgroud)

据我所知,在插入200个项目后,我可以使用resize为每个新元素获取新大小和默认值的函数来调整它.

当我运行该程序时,我看到:

0
1
2
...
199
200
Resizing
201
Run Code Online (Sandbox Code Playgroud)

为什么调整大小后只插入1个项目?

Fre*_*son 12

当添加的条目是复制构造时,您只能看到默认构造函数的计数.您还必须添加一个复制构造函数来计算副本:

   Data(const Data& other) { 
      // Actual copying code, whatever that may be
      Counter++; 
      std::cout << Counter << std::endl;
   }
Run Code Online (Sandbox Code Playgroud)

  • 复制ctor可以省略,所以你没有必要看到任何计数. (2认同)
  • @Fred:如果他打算将它用作实例计数,他还需要在析构函数中减少计数器.否则,无论何时调整向量的已分配空间(并复制所有元素),他的"实例计数器"将继续增加,尽管他只有400个未被破坏的对象(在调整大小调用之后).如果他要调用任何其他算法(例如排序),同样的事情就会发生. (2认同)

Eti*_*tel 5

因为默认构造函数被调用一次:std :: vector复制其内容,所以你实际上是复制相同的对象200次.