2013-03-13 74 views
0

我有以下類。std向量,複製數據結構

class Row 
{ 
    Table* parent_table; 
    Row(Table* construct); 
} 
class Table 
{ 
    std::vector<Row>; 
} 

我創建std::vector<Table> test;,並且在一個循環中創建表的對象和把它們放回至測試向量。問題是我在每一行中丟失了Table *。我需要指針,所以當我遍歷我的行時,我知道它屬於哪個表。

有沒有辦法強制std :: vector,而不是複製對象時,他們被推回來?

+0

」問題是我失去了每行內的表格*。「你能詳細說明一下,這是什麼意思?聽起來像是應該由合適的拷貝構造函數來照顧的東西。 – jrok 2013-03-13 13:56:05

+0

您是否知道'std :: vector

'中的對象地址可以隨着'push_back'的變化而變化?如果你需要對象的地址是穩定的,你不能直接將它們直接存儲在'std :: vector'中。下面的答案也適用於'std :: vector
' - 存儲'std :: vector >'。 – Yakk 2013-03-13 13:57:54

回答

4

代替存儲在std::vector,商店std::unique_ptr<Row>std::shared_ptr<Row>。這些對於這類事情來說已經足夠了(有更復雜的方法可以處理這個問題,例如存儲原始指針(複雜維護)或者滾動自己的類,或者使用自定義語義編寫自己的智能指針)。

unique_ptr只支持移動,因此避免了您的複製問題。 shared_ptr反而支持共享所有權,這可能是您不需要的東西。我建議使用unique_ptr

+0

Yeap使用共享指針更好選項 – 2013-03-13 13:53:53

1

通過引用或指針推送元素。您正在推送副本,以便複製元素是C++所能做的。我個人建議你使用像這樣的指針向量:std::vector<Row*>

實際上,一個更安全和更清潔的方法是存儲shared_ptr -s而不是裸指針,這樣就不必處理內存管理。喜歡的東西:

std::vector<std::shared_ptr<Row> >

0

在這種情況下,最簡單的解決辦法可能是一個迭代器存儲到您的表:

class Row 
{ 
    std:vector<Table>::iterator parent_table; 
    Row(std:vector<Table>::iterator construct); 
} 
+2

'std :: vector

:: iterator'很容易失效。我建議不要存儲這樣的迭代器,除非你知道所有'std :: vector'迭代器失效規則並且可以保證它們永遠不會發生。 – Yakk2013-03-13 13:55:46

+0

啊,你是對的......即使push_back無效迭代器,如果重新分配發生。謝謝你的提示 – JSQuareD 2013-03-13 13:57:34

1

你問兩個不相關的問題。請不要在一個帖子中這樣做。一個後一個問題。這使得回答更容易。

第二:

有沒有辦法強制的std ::載體,而不是當他們被推回到複製對象?

已被其他人回答。

FIRST:

創建一個std ::向量測試,和在一個循環中創建表的對象和把它們放回至測試向量。問題是我失去了Table裏面的Row *表。我需要指針,所以當我遍歷我的行時,我知道它屬於哪個表。

很可能您的ROW不包含對包含它的表的任何反向引用。這樣,當你傳遞行向量或行本身時,就會丟失關於誰擁有它的信息。您必須將table* owner以及table* owner之間的一行連同table* owner一起傳遞給行,或者您必須使行更加智能並強制所有行包含table* owner(也就是說,讓行包含對所有者的反向引用)

當然,反向引用可能是任何形狀。它不需要是一個指針。您可以通過Table&shared_ptr<Table>string tablename或任何可以幫助您直接或通過某個經理訪問表的內容。重要的是,Row必須包含它,或者它必須單獨傳遞,但與行一起傳遞。 「