每个循环初始化一个向量
当我声明一个向量时,它默认填充为零。作为模拟的一部分,我希望它在循环中初始化每个迭代。什么是正确和有效的方式来做到这一点?每个循环初始化一个向量
我想解决两种情况:
-
我想它被归零到一个已知的值,即
#include <iostream> #include <vector> using namespace std; const int nSteps = 10000; const int nReal = 10; int main() { for (unsigned int i = 0 ; i<nRealization; i++) { vector<double> v(nSteps); for (unsigned int j = 0 ; j<nSteps ; j++) { //stuff going on with v } } }
-
的长度没有限定n步(它被赋予与使用
push_back
功能)#include <iostream> #include <vector> using namespace std; const int nSteps = 10000; const int nReal = 10; int main() { for (unsigned int i = 0 ; i<nRealization; i++) { vector<double> v; // some function that uses push_back gives v its length for (unsigned int j = 0 ; j<nSteps ; j++) { //stuff going on with v } } }
由于Lightness Races in Orbit自己回答说,如果你不希望有矢量重新分配的每个循环,那么你可以将矢量退出循环,然后用std::fill
重新零向量
int main()
{
vector<double> v(nSteps);
for (unsigned int i = 0 ; i<nRealization; i++)
{
std::fill(v.begin(), v.end(), 0); // reset to zero
for (unsigned int j = 0 ; j<nSteps ; j++)
{
//stuff going on with v
}
}
}
在你第二个例子我建议你声明循环外的载体像在第一个例子,然后你只需要清空矢量每次迭代,你可以做到这一点std::vector::clear
int main()
{
vector<double> v;
for (unsigned int i = 0 ; i<nRealization; i++)
{
v.clear(); // erase all elements
// refill vector with function that uses push_back
for (unsigned int j = 0 ; j<nSteps ; j++)
{
//stuff going on with v
}
}
}
呼叫ing clear()
不会改变向量的容量,所以这将减少你每次迭代重用容量时的内存分配数量。现在有些时候,您可以使用大容量的矢量来制作少量元素,但下一次需要更大的容量时,它将会在那里。
太好了,谢谢你的回答 – jarhead
该文档是您的朋友。只要你想做一件事,只需阅读标准库实用程序列表,直到找到the one you want!
std::fill(v.begin(), v.end(), 0);
这基本上相当于一个老式memset
,但增加了类型安全。
@LightRacesinOrbit我已经改写过这个问题 – jarhead
@jarhead:啧啧,谢谢一堆。 –
我不太确定我明白你的问题,但你可以使用
v.clear();
v.resize(nSteps, initialValue);
重新初始化向量给定的规模和价值。 我认为这将适用于您的两种情况,并且您不需要push_back
。
但是,轻度说,文档是你的朋友。
你能否让你的例子更清楚?请包括你期望在每种情况下矢量的最终状态;即它应该具有什么长度和内容。 –
@DanHulme,第一个案例已经有答案 – jarhead
@DanHulme,在第二个案例中究竟有什么不明确的地方? – jarhead