STL迭代器作为返回值

时间:2009-11-23 21:42:04

标签: c++ stl iterator

我有A类,包含std :: vector,我想从A类外部访问该向量。

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

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

5 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

更多:

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();}
};