在C ++入门手册第3章中,有以下for循环将向量中的元素重置为零。
vector<int> ivec; //UPDATE: vector declaration
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix)
ivec[ix] = 0;
for循环是否真的为元素分配了0
值,还是我们必须使用push_back
函数?
那么,以下是否有效?
ivec[ix] = ix;
感谢。
答案 0 :(得分:4)
for循环真的分配0 元素的价值?或者,我们必须 使用push_back finction?
ivec[ix] =0
更新向量中现有元素的值,而push_back
函数向向量添加新元素!
那么,以下是否有效?
ivec [ix] = ix;
完全有效 IF ix < ivec.size()
。
如果使用iterator
而不是索引会更好。像这样,
int ix = 0;
for(vector<int>::iterator it = ivec.begin() ; it != ivec.end(); ++it)
{
*it = ix++; //or do whatever you want to do with "it" here!
}
将iterator
与STL一起使用是惯用的。首选迭代器而不是索引!
答案 1 :(得分:2)
是的,您可以使用方括号来检索和覆盖矢量的现有元素。但是请注意,您不能使用方括号将新元素插入到向量中,实际上索引超过向量的末尾会导致未定义的行为,通常会使程序彻底崩溃。
要增长向量,可以使用push_back,insert,resize或assign函数。
答案 2 :(得分:0)
使用数组括号,矢量对象的行为与任何其他简单数组一样。 push_back()
将其长度增加一个元素,并将新/最后一个设置为您传递的值。
答案 3 :(得分:0)
这个for循环的目的是迭代向量的元素。 从元素x开始(当ix为0时)直到最后一个元素(当ix是ivec.size()-1时)。
在每次迭代中,向量的当前元素设置为9。 这就是声明
ivec[ix] = 0;
一样。把
ivec[ix] = ix;
for循环中的会将向量的所有元素设置为它们在向量中的位置。即,第一个元素的值为零(向量从0开始索引),第二个元素的值为1,依此类推。
答案 4 :(得分:0)
是的,假设ix是一个有效的索引,很可能:你有一个int的向量,索引是size_type。当然,您可能希望有时存储-1以显示无效索引,因此将unsigned转换为signed是合适的,但我建议使用static_cast。
执行您正在执行的操作(将向量中的每个值设置为其索引)是一种创建其他集合的索引的方法。然后根据其他集合的谓词重新排列矢量排序。
假设您永远不会溢出(如果您的系统是32位或更多,则极不可能),您的转换应该有效。