这是for循环的合法使用吗?
Is this legal use of a for loop?
例如:
vector<int> something;
//imagine i add some elements to the vector here
int* pointy;
for (int i = 0; i < something.size(); pointy = &something[i++]) {
//do some work with pointy
}
似乎可以工作,并为我节省了一行,但是否有任何奇怪的错误弹出的危险,因为这一行?
这可能是不合法的,因为pointy
在第一次迭代时未赋值。如果循环在初始迭代期间没有解引用pointy
,则可能没有问题,但如果没有看到循环体,则无法判断。
由于您使用的是std::vector
,使用迭代器将为您节省另一行,因为您不需要声明pointy
。您可以通过从当前迭代器中减去something.begin()
来确定没有i
的偏移量:
for (vector<int>::iterator iter = something.begin() ; iter != something.end() ; ++iter) {
cout << "Item at index " << (iter - something.begin()) << " is " << *iter << endl;
}
是的,正如dasblinkenlight指出的那样,这很危险。但是有一种更简单的方法可以消除这类问题。
首先编写简单易懂的代码。将循环压缩到尽可能少的行数不会在性能方面增加任何东西,即使有,只要您的分析器不告诉您循环是瓶颈,您就不应该关心。
另一方面,它将使您的代码更难阅读,并且可能更容易出现错误(正如您可能已经注意到的)。
在c++ 11中,考虑使用基于范围的for
循环:
for (int& p : something)
{
// ...
}
在c++ 03中,考虑使用std::for_each()
,或者基于迭代器的经典循环:
for (std::vector<int>::iterator i = something.begin(); i != something.end(); ++i)
{
// use *i to refer to the current pointy
// use (i - something.begin()) to get its index
// ...
}
这很危险,因为i
不是unsigned
。在一些罕见的情况下,它会爆炸。:)
这真的安全吗?Pointy是指向向量中元素的指针。这意味着,如果您更改了point的值,或者它指向更具体的内容,您实际上是在更改该特定元素的向量内容。
对于我来说,我喜欢这样处理较大的对象的std::vector:
std::vector<int*> mynumbers;
//add elements here like this:
int somenumber = 5;
mynumbers.push_back(&somenumber);
for(int i=0;i<elemnts.size();i++)
{
cout << "Element Nr. " << i << ": " << *elements.at(i) << endl;
//modify like this:
*elements.at(i) = 0;
}
使用指针而不是变量本身是因为std::vector处理指针的速度比大对象本身快,但对于int,这并没有太大的区别,所以你也可以这样做:
std::vector<int> mynumbers;
mynumbers.push_back(5);
int* pointy
for(int i=0;i<elemnts.size();i++)
{
pointy = &elements.at(i);
}
对我很有用!
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式