1

在 C++ Primer 一书的第 (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;

谢谢。

4

5 回答 5

5

for 循环是否真的为元素分配了 0 值?或者,我们必须使用 push_back 函数?

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!
}

使用iteratorwith STL 是惯用的。更喜欢迭代器而不是索引!

于 2011-01-31T11:00:35.987 回答
2

是的,您可以使用方括号来检索和覆盖向量的现有元素。但是请注意,您不能使用方括号将新元素插入到向量中,事实上,超过向量末尾的索引会导致未定义的行为,通常会使程序彻底崩溃。

要增大向量,您可以使用 push_back、insert、resize 或 assign 函数。

于 2011-01-31T11:01:15.927 回答
0

使用数组括号,向量对象的行为就像任何其他简单数组一样。 push_back()将其长度增加一个元素并将新/最后一个设置为您传递的值。

于 2011-01-31T11:04:34.490 回答
0

这个 for 循环的目的是遍历向量的元素。从元素 x 开始(当 ix 为 0 时)直到最后一个元素(当 ix 为 ivec.size() -1 时)。

在每次迭代中,向量的当前元素设置为 9。这就是语句的内容

ivec[ix] = 0;

做。推杆

ivec[ix] = ix;

在 for 循环中会将向量的所有元素设置为它们在向量中的位置。即,第一个元素的值为零(因为向量从 0 开始索引),第二个元素的值为 1,依此类推。

于 2011-01-31T11:04:53.490 回答
0

是的,假设 ix 是一个有效的索引,很可能:你有一个 int 向量,索引是 size_type。当然,有时您可能想故意存储 -1 以显示无效索引,因此将无符号转换为有符号是合适的,但我建议使用 static_cast。

做你正在做的事情(将向量中的每个值设置为其索引)是一种创建其他集合索引的方法。然后,您根据另一个集合的预测重新排列您的向量排序。

假设您永远不会溢出(如果您的系统是 32 位或更多,则极不可能)您的转换应该可以工作。

于 2011-01-31T11:34:00.850 回答