迭代多个std :: vector

时间:2010-02-04 14:51:06

标签: c++ stl iterator

我在这里和其他地方读过,当你使用索引迭代std :: vector时,你应该:

std::vector <int> x(20,1);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
  x[i]+=3;
}

但是,如果你正在迭代两个不同类型的向量,那该怎么办:

std::vector <int> x(20,1);
std::vector <double> y(20,1.0);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
  x[i]+=3;
  y[i]+=3.0;
}

假设

是否安全

std::vector<int>::size_type

的类型相同
std::vector<double>::size_type

使用std :: size_t是否安全?

感谢。

5 个答案:

答案 0 :(得分:7)

是的,几乎任何实际目的,你都可以使用std :: size_t。虽然有(一种)意图,不同的容器可以使用不同类型的大小,但基本上保证(至少对于标准容器)size_type与size_t相同。

或者,您可以考虑使用算法,例如:

std::transform(x.begin(), x.end(), x.begin(), std::bind2nd(std::plus<int>(), 3));
std::transform(y.begin(), y.end(), y.begin(), std::bind2nd(std::plus<double>(), 3.0));

答案 1 :(得分:2)

通常,C ++标准不提供这样的保证:对于不同参数化的容器,size_types都不相等,也不与size_t相等。

答案 2 :(得分:2)

我认为您可以放心地假设size_type是无符号的非整数。除此之外,你不能依赖它。当然,大多数容器的size_type都与size_t相同,但没有任何保证。

SGI文档和此来源http://www.cplusplus.com/reference/stl/vector/似乎同意这一点。

您可能还想查看此问题的解决方案:http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#C.2B.2B

我希望这会有所帮助。

答案 3 :(得分:1)

好吧,我认为:

 for (std::vector<int>::size_type i = 0; i < x.size(); i++){

是一个完美的理事会 - 你期待你的向量真的是巨大的吗?就个人而言,我使用unsigned int,没有问题。

现在我想假装将开始......

答案 4 :(得分:-1)

您应该使用迭代器

std::vector <int> x(20,1);
std::vector <double> y(20,1.0);
std::vector<double>::iterator j = y.begin();
for (std::vector<int>::iterator i = x.begin(); i != x.end(); ++i){
  *i +=3;
  *j +=3.0;
  ++j;
}

因为无法保证u size_type与内部类型相同,无论如何,std::vector您可以使用unsigned int进行迭代