首页 文章

STL迭代器作为返回值

提问于
浏览
4

我有一个包含std :: vector的A类,我想从A类外部访问该向量 .

我想到的第一件事就是创建一个将迭代器返回给向量的get函数,但是遍历向量我将需要两个迭代器(开始和结束) .

我想知道是否有任何方法(技术或模式)只用一个迭代器迭代整个向量?或者可能有其他方式来访问vector,当然不使用vector作为返回值:)

5 回答

  • 7

    为什么不在你的类中添加一个begin()和end()函数,只需 return v.begin();return v.end(); ? (假设v是你的向量 . )

    class MyVectorWrapper
    {
    public:
      // Give yourself the freedom to change underlying types later on:
      typedef vector<int>::const_iterator const_iterator;
    
      // Since you only want to read, only provide the const versions of begin/end:
      const_iterator begin() const { return v.begin(); }
      const_iterator end() const { return v.end(); }
    
    private:
      // the underlying vector:
      vector<int> v;
    }
    

    然后你可以像其他任何一样迭代你的类:

    MyVectorWrapper myV;
    for (MyVectorWrapper::const_iterator iter = myV.begin(); iter != myV.end(); ++i)
    {
      // do something with iter:
    }
    
  • 1

    给予对向量的大量访问似乎是不明智的,但是如果你为什么不直接返回一个指针或对向量的引用呢? (返回向量本身可能会很昂贵 . )或者,返回一个 std::pair<> 的迭代器 .

    迭代器只是一个对象的指示器;例如,指针可以是一个非常好的随机访问迭代器 . 它不包含有关对象所处的容器类型的信息 .

  • 0

    STL引入了使用两个迭代器来描述范围的习惯用法 . 从那时起 begin()end() 就是吸气剂 . 这样做的好处是可以将一对指向C数组的指针用作完美的迭代器 . 缺点是你需要携带两个物体 . C 1x将,AFAIK,引入一个范围概念,以稍微缓解后者 .

  • 0

    这听起来像你需要完成的将是潜在的违反所谓的Law of Demeter . 这项法律通常是一种矫枉过正,但通常遵守它是合理的 . 虽然您可以通过仅给出常量迭代器来授予只读访问权限,但是如果没有第三方知道它,您仍然有可能使迭代器失效(很容易使用向量) . 由于您无法预测程序将如何随着时间的推移而发展,因此最好避免提供可能被滥用的功能 .
    共同的座右铭:让您的课程界面易于使用且难以滥用 . 第二部分对整体产品质量很重要 .

  • 1

    更多:

    template <typename T,typename A = std::allocator<T>>
    class yetAnotherVector
    {
    public:
     typedef std::_Vector_iterator<T, A> iterator;
    protected:
     std::vector<T,A> mV;
    public:
     void add(const T& t)
     {
      if(!isExist(t))mV.push_back(t);
     }
        bool isExist(const T& t)
     {
      std::vector<T,A>::iterator itr;
      for(itr = mV.begin(); itr != mV.end(); ++itr)
      {
       if((*itr) == t)
       {
        return true;
       }
      }
      return false;
     }
     iterator begin(void){return mV.begin();}
     iterator end(void){return mV.end();}
    };
    

相关问题