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

C++矢量洞察

  •  2
  • Sunscreen  · 技术社区  · 14 年前

    1. 如果我有一个向量,让我们说: std::vector<CString> v_strMyVector (int)v_strMyVector.size > i 我可以访问I成员: v_strMyVector[i] == "xxxx"; ? (但它确实有效,为什么?)

    2. 如果我可以直接访问向量的所有成员(参见1),那么迭代器的用途是什么?

    太阳

    6 回复  |  直到 13 年前
        1
  •  10
  •   kennytm    14 年前
    1. 它的工作只是因为没有边界检查 operator[] v_strMyVector.at(i) ,它将抛出OutOfRange异常。

      这是因为 运算符[] 返回引用。

    2. vector

    3. 迭代器允许您编写独立于容器的算法。这个迭代器模式在 <algorithm> 库允许更容易地编写泛型代码,例如,不需要每个M容器都有N个成员(即编写M*N函数)

      std::vector<T>::find(x)
      std::list<T>::find(x)
      std::deque<T>::find(x)
      ...
      std::vector<T>::count(x)
      std::list<T>::count(x)
      std::deque<T>::count(x)
      ...
      

      我们只需要N个模板

      find(iter_begin, iter_end, x);
      count(iter_begin, iter_end, x);
      ...
      

        2
  •  4
  •   Matthew Flaschen    14 年前
    1. 它返回一个引用。
    2. 否,因为vector具有随机访问权限。但是,对于其他类型(例如。 list
    3. 统一所有集合(以及其他类型,如数组)。这样你就可以使用 algorithms 喜欢 std::copy 符合要求的任何类型。
        3
  •  3
  •   fredoverflow    14 年前

    手动循环输出:

    for (std::vector<std::string>::iterator it = vec.begin(); it != end(); ++it)
    {
        std::cout << *it << "\n";
    }
    

    std::copy(vec.begin(), vec.end(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
    

    调用成员函数的手动循环:

    for (std::vector<Drawable*>::iterator it = vec.begin(); it != end(); ++it)
    {
        (*it)->draw();
    }
    

    算法:

    std::for_each(vec.begin(), vec.end(), std::mem_fun(&Drawable::draw));
    

    希望有帮助。

        4
  •  1
  •   Kevin Le - Khnle    14 年前
    1. []操作员超负荷工作:

      引用运算符[](大小\u类型n)

    看到了吗 http://www.sgi.com/tech/stl/Vector.html

    1. 使用迭代器遍历STL中的任何集合都是事实。

    2. 我认为一个优点是,如果用另一个集合替换vector,那么所有代码都将继续工作。

        5
  •  1
  •   caseq    14 年前
    1. 这就是向量的概念,它们提供对所有项的直接访问,就像常规数组一样。在内部,向量表示为动态分配的连续内存区域。这个 operator [] 定义为模仿正则数组的语义。

    2. 0 v_strMtVector.size()-1 ,就像使用常规数组一样:

      for (int i = 0; i < v_strMtVector.size(); ++i) {
          ... 
      }
      

      也就是说,许多人认为使用迭代器是一种好的样式,因为。。。

    3. std::vector<> std::list<> . 迭代器也可以与STL算法一起使用,例如std::sort()。
        6
  •  0
  •   bshields    14 年前