2011-09-13 51 views
1

陣列我想共享雙打大小k與一種或多種載體STL v1v2 ... vna的數組的內容。共享與STL矢量

我想從這個共享存儲中獲得的效果是,如果底層數組得到修改,則可以從與數組共享其內容的所有向量中觀察到更改。

我能做到這一點定義矢量v1 ... vn爲指針

vector<double*> v1; 

的載體通過與a複製指針a + k到該載體。但是,我不喜歡這種解決方案。我想要矢量是雙打的矢量。

鑑於您可以從矢量中提取基礎指針,我假設可以用共享內容的方式初始化矢量。將不勝感激關於如何做到這一點的幫助。

+1

通過「分享」你的意思是,'v'的必須具有獨特的身份,因爲他們會以某種方式做獨立的責任(也許有在'[l> k]'中的其他值是否有一些原因,你不能使'a'成爲一個向量,而'v'也引用它? – dmckee

+1

相關並可能重複:[在C++ std :: vector和C數組沒有複製](http://stackoverflow.com/questions/1733143/converting-between-c-stdvector-and-c-array-without-copying),雖然問題的這部分的答案是在評論 –

+0

@dmckee我想要的是,如果數組中的一個元素被修改,那麼所有相應的向量元素將被修改也是。 – san

回答

1

這聽起來像我想你想別名與向量的數組。因此,邏輯上你需要一個引用向量(這不適用於語法原因)。如果您確實需要此功能,您可以編寫自己的ref包裝類,表現爲,與實際的C++參考完全相同,因此您的vn矢量的用戶將無法區分vector<T>vector<ref<T> >(例如T = double)。但在內部,可能會將向量中的項目鏈接到「主」數組中的項目。

但你應該有該死的很好的理由這樣做的開銷馬戲團:)

2

鑑於您可以從矢量中提取基礎指針,我假設可以用共享內容的方式初始化矢量。

不,你不能這樣做。標準庫容器始終管理自己的內存。

您最好的選擇是創建std::vector<double>,然後在需要時使用它作爲數組(通過&v[0],假設向量不爲空)。

如果您只想擁有容器接口,請考慮使用std::array(或boost::arraystd::tr1::array)或編寫您自己的容器接口來封裝陣列。

+1

我想我沒有清楚地解釋我自己。我想走向相反的方向。不將現有矢量的視圖作爲數組公開,而是給出現有數組的矢量視圖。感謝您的更正,我提取的東西是返回'&v [0]' – san

+2

正確。你不能那樣做。我在說,你最好的選擇是試着反轉它,這樣'vector'擁有數據,如果這是不可能的,寫你自己的容器接口。 –

1

好的,標準庫容器都是持有者的信息,而的那些元素是。也就是說,幾乎所有的容器都可以用於幾乎任何算法,至少可以使用begin()end()

當你分開這兩個元素(元素持有和元素枚舉),在你的情況下,你可能會考慮boost.rangeboost.range爲您提供了一對迭代器,用於界定應用算法的範圍,並且您的數組中有實際的內存存儲。這主要是爲了讀取訪問它們,因爲通常修改向量的結構會使迭代器失效。不過,您可以重新創建它們。

+0

這不完全是我在這裏所需要的,但是提供了信息。我相信我會在別處找到它的用處。 – san