我在这里和其他地方读过,当你使用索引迭代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是否安全?
感谢。
答案 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
进行迭代