在C++中重用向量

Bla*_*de3 14 c++

我有一个向量声明为全局变量,我需要能够重用.例如,我正在读取多个数据文件,解析数据以创建随后存储在向量中的对象.

vector<Object> objVector(100);

void main()
{
 while(THERE_ARE_MORE_FILES_TO_READ)
 {
    // Pseudocode
     ReadFile();
     ParseFileIntoVector();
     ProcessObjectsInVector();
     /* Here I want to 'reset' the vector to 100 empty objects again */

 }
Run Code Online (Sandbox Code Playgroud)

}

我可以将矢量重置为"vector objVector(100)",因为它最初是在堆栈上分配的吗?如果我执行"objVector.clear()",它将删除所有100个对象,并且我将有一个大小为0的向量.我需要在每个循环开始时大小为100.

Kon*_*lph 11

我有一个向量声明为全局变量,我需要能够重用.

为什么?从您的代码中不清楚为什么变量必须是全局的.你为什么不能声明它里面的循环?然后你不需要重置它,这将在每个循环中自动完成.

要从其他方法访问变量,请将其作为参数传递(通过引用,以便您可以对其进行修改).拥有全局变量很少是一个好的解决方案.

其他东西:main必须永远不会有返回类型void,这是无效的C++,许多编译器会拒绝它.


Unc*_*ens 6

objVector.clear();
objVector.resize(100);
Run Code Online (Sandbox Code Playgroud)

但是,这可能不建议使用vector.您是否确定不应该使用push_back最初为空的矢量?你怎么能确定每个文件包含正好100个对象,而不是更少,正如你的问题所示?

矢量可能也不需要是全局的.最好传递一切.当你看到一堆没有参数调用的函数时,如果不是不可能跟踪发生的事情是非常困难的(因为除了你之外的其他人 - 包括你在几个月后回到这个代码时 - 会有不知道这些函数用于输入和输出是什么).


Pra*_*are 4

vector<Object> objVector(100); 

int main() 
{ 
 while(THERE_ARE_MORE_FILES_TO_READ) 
 { 
    // Pseudocode 
     ReadFile(); 
     ParseFileIntoVector(); 
     ProcessObjectsInVector(); 
     /* Here I want to 'reset' the vector to 100 empty objects again */ 
     objVector.clear();
     objVector.resize(100);

 } 
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我仍然认为 swap() 是完成此类工作的推荐方法。请参阅《有效 STL:使用“交换技巧”来削减多余容量》的第 17 条。执行清除然后调整大小实际上更慢 - 它比 swap() 有额外的内存分配操作 (2认同)
  • 修剪多余的容量通常是不需要的(这就是 stdlib 也不这样做的原因)。频繁分配会导致性能下降。通过重用向量所获得的性能优势也将完全丧失。 (2认同)