簡體   English   中英

STL迭代器作為返回值

[英]STL iterator as return value

我有A類,它包含std :: vector,我想從A類外部訪問該向量。

我想到的第一件事就是創建一個將迭代器返回到向量的get函數,但是遍歷向量我將需要兩個迭代器(開始和結束)。

我想知道是否有任何方法(技術或模式)只用一個迭代器迭代整個向量? 或者可能有其他方式來訪問vector,當然不使用vector作為返回值:)

為什么不在你的類中添加一個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:
}

STL引入了使用兩個迭代器來描述范圍的習慣用法。 從那時起, begin()end()就是吸氣劑。 這樣做的好處是可以將一對指向C數組的指針用作完美的迭代器。 缺點是你需要攜帶兩個物體。 C ++ 1x將,AFAIK,引入一個范圍概念,以稍微緩解后者。

給予對向量的大量訪問似乎是不明智的,但是如果你為什么不直接返回指針或對向量的引用呢? (返回向量本身可能會很昂貴。)或者,返回一個std::pair<>的迭代器。

迭代器只是一個對象的指示器; 例如,指針可以是一個非常好的隨機訪問迭代器。 它不包含有關對象所處的容器類型的信息。

聽起來你需要完成的事情可能會違反所謂的得墨忒耳法則 這項法律通常是一種矯枉過正,但通常遵守它是合理的。 雖然您可以通過僅給出常量迭代器來授予只讀訪問權限,但是如果沒有第三方知道它,您的迭代器仍將面臨無效(使用向量)的風險。 由於您無法預測程序將如何隨着時間的推移而發展,因此最好避免提供可能被濫用的功能。
共同的座右銘:讓您的課程界面易於使用且難以濫用。 第二部分對整體產品質量很重要。

更多:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM