我有一个向量声明为全局变量,我需要能够重用。例如,我正在读取多个数据文件,解析数据以创建随后存储在向量中的对象。
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。
答案 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)”,因为它最初是在堆栈上分配的吗?
C ++向量不在堆栈上分配。至少不是直接的。向量(和其他STL模板)的参数之一是分配器。您可以使用池分配器,堆分配器等。
std::vector<T>
实际上很好地打包了指向数组的指针,其中包含其他信息(例如大小和容量)。否则,必须事先知道向量的大小(这不是必需的)。
实际上在上面的示例中,std::vector<T>
不在堆栈上,而是在程序的数据部分(或者如何在非ELF平台上调用)。
所以问题是你是否需要:
resize
方法仍然可以很好地实现。