在C ++中迭代一个向量的正确方法是什么?
考虑这两个代码片段,这个工作正常:
for (unsigned i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
和这个:
for (int i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
生成warning: comparison between signed and unsigned integer expressions。
我是C ++世界的新手,所以unsigned变量对我来说看起来有些可怕,而且我知道unsigned如果使用不正确,变量可能是危险的,所以 - 这是正确的吗?
在你的例子中的具体情况,我会使用STL算法来完成这个。
#include <numeric>
sum = std::accumulate( polygon.begin(), polygon.end(), 0 );
对于一个更一般的,但仍然相当简单的情况下,我会去:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
using namespace boost::lambda;
std::for_each( polygon.begin(), polygon.end(), sum += _1 );
使用标准的C ++ 11(又名C ++ 0x),实际上有一个新的令人愉快的方法(以打破向后兼容性为代价):new auto关键字。它可以节省您不得不显式指定要使用的迭代器的类型(再次重复向量类型)的痛苦,当(编译器)显而易见的时候,使用哪种类型。随着v做你的vector,你可以这样做:
for ( auto i = v.begin(); i != v.end(); i++ ) {
std::cout << *i << std::endl;
}
C ++ 11更进一步,为您提供了一个特殊的语法来迭代像矢量集合。它消除了写东西总是一样的必要性:
for ( auto &i : v ) {
std::cout << i << std::endl;
}
要在工作程序中查看它,请构建一个文件auto.cpp:
#include <vector>
#include <iostream>
int main(void) {
std::vector<int> v = std::vector<int>();
v.push_back(17);
v.push_back(12);
v.push_back(23);
v.push_back(42);
for ( auto &i : v ) {
std::cout << i << std::endl;
}
return 0;
}
在写这篇文章的时候,当你用g ++编译时,通常需要通过给出一个额外的标志来将它设置为使用新的标准:
g++ -std=c++0x -o auto auto.cpp
现在你可以运行这个例子:
$ ./auto
请注意,编译和运行的指令是Linux上特定于gnu c ++编译器的,程序应该是平台(和编译器)独立的。