2014-04-08 128 views
0

這是我的代碼。將1D矢量插入2D矢量而不創建Temp 1D矢量

vector<vector<string>> table; 
vector<string> record; 

// ..... 
record.push_back("Apple"); 
record.push_back("Orange"); 

table.push_back(record); 

// .... 

這裏在2D矢量中插入一行我創建了一個叫做記錄的新的1D矢量。我的問題是,「有沒有辦法將這些數據插入2D矢量而不創建1D矢量?」

回答

2

有2種方法。第一種方法是使表格成爲指向矢量的矢量的矢量,而不是矢量的矢量。 即:

vector<vector<string>*> table 

..然後堆棧指針記錄的記錄本身,而不是,這是非常小的。 另一種方式是,如果你知道你會不會用你的一維向量來了,你可以把它移到表矢量 即:

table.push_back(std::move(record)); 

只知道,從那以後用做它的這種方式那個特定的記錄對象將處於未定義的狀態,即不可用,除了在你的表內。

+0

梅,向量的指針...? – jrok

+0

矢量指針。然而,指向矢量對象的指針對於更新的人更清晰 – Julius

+0

我採取了第二種方式。謝謝。 –

1

也許是這樣的:

v.emplace_back(std::initializer_list<std::string> {"Apple", "Orange"}); 

emplace_back轉發它的參數來構建一個載體到位。查看reference page

+0

接受答案'v.emplace_back({「Apple」,「Orange」});'不工作? – Julius

0

這種方法是不是線程安全的,但如果你只有一個線程可能會獲得更好的性能:

vector<vector<string> > table; 

// insert empty element 
table.push_back(vector<string>()); 

// get reference to last inserted element 
vector<string>& record = table.back(); 
record.push_back("Apple"); 
record.push_back("Orange"); 
0

如果你正在使用gcc,那麼你可以使用「初始化列表」(C++ 11功能)像這樣:

std::vector< std::vector<int> > myvector; 
myvector[0] = {10,20,30}; 

但是,Visual Studio編譯器仍然不支持此C++ 11功能。