代码之家  ›  专栏  ›  技术社区  ›  Mark

迭代多个std::vector

  •  10
  • Mark  · 技术社区  · 15 年前

    我在这里和其他地方读过,当使用索引迭代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 回复  |  直到 15 年前
        1
  •  7
  •   Jerry Coffin    15 年前

    是的,对于几乎任何实际用途,您都可以使用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));
    
        2
  •  2
  •   Alexander Poluektov    15 年前

    一般来说,C++标准没有给出这样的保证:对于不同的参数化容器,SIEZHI类型既不相等,也不等于SIEZHETT。

        3
  •  2
  •   batbrat    15 年前

    我想你可以放心地假设 size_type 是无符号非累积整数。你不能过分依赖它。当然,大多数集装箱都有 SiZe型 这和 size_t 但是没有保证。

    SGI文档和此源 http://www.cplusplus.com/reference/stl/vector/ 在这一点上似乎是一致的。

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

    我希望这有帮助。

        4
  •  1
  •   anon    15 年前

    嗯,我认为:

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

    是一个完美的委员会吗?你期待你的向量真的是巨大的吗?我个人用 unsigned int 没有问题。

    现在,我想下议院将开始…

        5
  •  -1
  •   erick2red    15 年前

    应该改用迭代器

    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_类型是相同的内部类型 std::vector 您可以使用 unsigned int