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

迭代std::vector(没有迭代器)时要使用哪种类型?

c++
  •  5
  • Danvil  · 技术社区  · 14 年前

    也许这个问题很琐碎,但再仔细想想,我想知道如何真正正确地做到以下几点:

    std::vector<K> v = ...;
    for(T i=0; i<v.size(); ++i) {
      const K& t = v[i];
      // use t *and i*
    }
    

    T 是吗? int unsigned int , int32_t , size_t v.size() )或者其他建议?请尽量考虑可移植性、易出错性和性能,并客观地回答问题。

    编辑:

    3 回复  |  直到 14 年前
        1
  •  6
  •   Greg Hewgill    14 年前

    类型 i 应与的返回值相同 size() std::vector<K>::size_type size_t 会很好的。如果你使用 整数类型,则编译器可能会在小于比较中警告有符号/无符号不匹配。

    通常您会使用迭代器:

    std::vector<K> v = ...;
    for (std::vector<K>::iterator i = v.begin(); i != v.end(); ++i) {
      const K& t = *i;
      // use t
    }
    

    或者,在C++ 0x:

    std::vector<K> v = ...;
    for (auto i = v.begin(); i != v.end(); ++i) {
      const K& t = *i;
      // use t
    }
    

    std::distance() 向量迭代器的常数时间运算函数:

    std::vector<K> v = ...;
    for (auto i = v.begin(); i != v.end(); ++i) {
      const K& t = *i;
      size_t index = std::distance(v.begin(), i);
      // use t and index
    }
    
        2
  •  3
  •   Victor Nicollet    14 年前

    返回的类型 v.size 并期望 v[] std::vector<K>::size_type .

        3
  •  3
  •   kennytm    14 年前

    类型T通常不重要,只要它和向量大小一样大。

    就表现而言,应该没有任何区别。

    值来自 i ,你会得到一个大的正数,这比负数更难检查。但是因为 v.size() 是一个 size_t ,如果对T使用有符号整数,则 v 有2个 31 (或2) )项目,项目 必须在结束前失效。但我认为,如果向量需要那么大(尤其是在64位平台上),还有一个比选择哪种类型更大的问题。

    从不使用 int32_t 作为一个柜台。


    (这些在OP编辑之前:)

    但在您的情况下,您可能希望使用迭代器进行迭代。

    for (std::vector<K>::const_iterator cit = v.begin(); cit != v.end(); ++ cit) {
      const K& t = *cit;
      // ...
    }
    

    Boost.Foreach

    BOOST_FOREACH(const K& t, v) {
      // ...
    }
    

    在C++ 0x中,这变成了 built-in feature

    for (const K& t : v) {
      // ...
    }
    

    但是,大多数声称支持C++ 0x的编译器应该允许 auto :

    for (auto cit = v.cbegin(); cit != v.cend(); ++ cit) {
       const K& t = *cit;
       // ...
    }
    

    或lambda表达式:

    std::for_each(v.cbegin(), v.cend(), [](const K& t) { 
       ...
    });