在C ++中重用向量

时间:2010-03-11 16:56:03

标签: 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 */

 }

}

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

10 个答案:

答案 0 :(得分:11)

  

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

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

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

其他内容:main必须从不返回类型void,这是无效的C ++,许多编译器会拒绝它。

答案 1 :(得分:6)

objVector.clear();
objVector.resize(100);

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

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

答案 2 :(得分: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);

 } 
}

答案 3 :(得分:2)

在循环的开头或结尾调用调整大小:http://www.cplusplus.com/reference/stl/vector/resize/

那应该做你想要的。但是,我建议使用推送和弹出功能。它更节省空间,并且是如何使用Vector的。当您从中推送(添加)和弹出(删除)项目时,矢量将根据需要进行扩展和缩小。这样您就不必担心矢量的大小或内容。它只是一个处理队列。

答案 4 :(得分:2)

您为什么要重置全局变量?只需在循环中分配一个新的向量,然后通过引用将向量传递给函数。

void ParseFileIntoVector(vector<Object> &vector);
void ProcessObjectsInVector(const vector<Object> &vector);

int main() 
{ 
 while(THERE_ARE_MORE_FILES_TO_READ) 
 { 
     // Pseudocode 
     vector<Object> objVector(100); 
     ReadFile(); 
     ParseFileIntoVector(objVector); 
     ProcessObjectsInVector(objVector); 
 } 
}

答案 5 :(得分:1)

以下代码可以解决问题。

vector<Object> temp(100);
objVector.swap(temp);

答案 6 :(得分:1)

与其他帖子相反,最有效的方法可能就是:

objVector.resize(0);
objVector.resize(100);

clear()释放某些实现上的向量的内存(它唯一需要的后置条件是size()= 0)。 resize(0)保持容量。

交换技巧还会调用不必要的内存分配。您交换的临时向量将分配一个新的内存块,并且在交换之后也会释放旧的内存块。没有内存分配,性能应该更好。

答案 7 :(得分:0)

致电objVector.clear()以删除以前的数据点,然后objVector.resize(100)将其调整为适当大小。

但请注意,这将使用默认构造函数分配1个Object实例,然后使用复制构造函数分配100个Object副本,这可能与您实际可能不同想。 (可选)如果Object是指针类型,则可以使用objVector.resize(100, NULL)来避免可能不需要的分配。

答案 8 :(得分:0)

由于您使用的是“Object”的默认构造函数,我认为您应该能够依赖向量的容量而不是其大小。因此,当您调用clear()时,您可能无法更改向量构造函数设置的容量(您可以保留至少100个元素,它们已经分配)。阅读容量,储备和大小以及它们各自的差异(保留是您要求更改容量的电话,我只是在需要时指出它。)

但是,无论如何,如果你需要将对象重置为默认状态,而不是依赖于对对象进行矢量范围重置的能力,你也可以只调用你的对象叫做“reset”将它们设置为该状态,并在使用这些相同对象重新处理之前调用它。在性能方面,我不认为它有任何不同,而且在代码方面它似乎是一个干净的解决方案。

答案 9 :(得分:0)

我可以将向量重置为“vector objVector(100)”,因为它最初是在堆栈上分配的吗?
  1. C ++向量不在堆栈上分配。至少不是直接的。向量(和其他STL模板)的参数之一是分配器。您可以使用池分配器,堆分配器等。

    std::vector<T>实际上很好地打包了指向数组的指针,其中包含其他信息(例如大小和容量)。否则,必须事先知道向量的大小(这不是必需的)。

  2. 实际上在上面的示例中,std::vector<T>不在堆栈上,而是在程序的数据部分(或者如何在非ELF平台上调用)。

  3. 所以问题是你是否需要:

    • 大小为100的向量。在这种情况下,正如已经指出的那样,你可能正在做一些奇怪的事情。但是resize方法仍然可以很好地实现。
    • 容量为100的向量。在这种情况下,您可能不应该做任何事情,因为向量不会缩小其容量AFAIR。并且当然,矢量不会动态地改变其容量。