2012-10-31 69 views
2

我想從具有以下屬性的方法返回std::vector:接收者(用戶)將能夠編輯向量中的元素,但不會更改向量本身(調整大小,刪除,加等)C++ STL向量半常數

  • 如果我返回std::vector<T>&,接收器將能夠調整其大小,添加元素吧,等
  • 如果我返回std::vector<T> const&(沒有我宣佈,對吧?),他們將無法改變這些元素。
  • 如果我返回std::vector<T>,它將是一個全新的向量,並且對元素的更改不會在原始向量中。

有沒有辦法做到這一點?也許是引用的vetor,返回爲const(std::vector<T&> const)?有沒有這樣的事情?如果有的話,它是否可以將我的std::vector<T>隱式轉換成它?

+1

'std :: pair '? – avakar

+1

IMO它會更好的設計給你的類(例如)一個函數'T&at(size_t idx)',它一次只返回一個元素的引用。或者可能是'begin()'和'end()'函數返回迭代器。你想要做的是將'std :: vector'的接口包含到你的類的接口中,這個接口將你的類與一個特定的實現細節聯繫起來(它把它的數據存儲在一個'vector'中,而不是' deque「或」set「或其他)。 –

+0

@SteveJessop這很好,和'vector'一樣不會隱藏它是一個向量;)我正在嘗試創建一個類似於向量的二維數組類。各種方法將返回一個「行」,它實際上是內部「平面」向量的一部分。我想如果我需要我可以有一個'it rowBegin(i)'和'it rowEnd(i)',但我還想要一個'vector row(i)'方法。 – baruch

回答

6

由於您似乎有能力按引用返回向量,因此可以將迭代器返回到該向量的開始和結尾。使用迭代器,用戶可以編輯任何矢量成員,但不能添加或刪除矢量本身。

您還可以提供一個函數,該函數提供隨機訪問索引,可能超載operator[]

+0

唯一的缺陷是迭代器可能失效。 (取決於當然的代碼。)也許返回一個包裝會更好? – ybungalobill

+0

@ybungalobill其實,我認爲如果迭代器可以失效,那麼在任何情況下基本上都是運氣不好的。你打算使用什麼?指數?指數也可以「失效」(例如,當你刪除元素時);它不會像迭代器那樣頻繁發生,但危險仍然存在。 –

+0

返回2個迭代器意味着返回一個'pair',對吧? – baruch

0
// vector of pointers to elements by value 
std::vector<T*> 
// reference to const vector of pointers to elements 
std::vector<T*> const& 
// shared pointer of to const vector of pointers to elements 
std::shared_ptr<std::vector<T*> const> 

// vector of shared pointers to elements by value 
std::vector<std::shared_ptr<T> > 
// reference to const vector of shared pointers to elements 
std::vector<std::shared_ptr<T> > const& 
// shared pointer of to const vector of shared pointers to elements 
std::shared_ptr<std::vector<std::shared_ptr<T> > const> 
2

如果你不想要一個向量的屬性,不要返回一個向量。設計一個具有所需屬性的類。如果合適的話,使用矢量來實現它。矢量是一種工具,本身不是目的。