2012-05-07 63 views
11

在地圖中值。例如:插入載體爲我停留在試圖找出如何插入載體在地圖中的值在C++

#include <iostream> 
#include <vector> 
#include <map> 

using namespace std; 

int main() 

{ 

    map <int, vector<int> > mymap; 

    mymap.insert(pair<int, vector<int> > (10, #put something here#)); 

    return 0; 
} 

我不知道用什麼語法插入一個向量值。我試過{1,2},但是失敗了。我應該使用什麼語法?

一切正常,如果我事先聲明瞭一個載體,給它一個名字,但我不想這樣做,因爲我想有很多矢量的地圖。

預先感謝您

+0

你怎麼知道內容應該是什麼? – mkb

回答

7

基本上你的問題不是關於將std::vector插入std::map。你的問題是你如何可以輕鬆地創建一個匿名std::vector任意初始元素值。

在ISO C++ 03,你不能。然而,C++11 allows using initialization lists for this

如果你堅持用C++編譯器03,你有可能可以創建一個輔助函數返回一個向量與指定的元素:如果要插入的載體是不同大小的

std::vector<int> make_vector(int a, int b) 
{ 
    std::vector<int> v; 
    v.push_back(a); 
    v.push_back(b); 
    return v; 
} 

,你可以使用可變參數函數,儘管這樣做需要你傳遞元素數量或者保留一個哨兵值。

+0

你可以創建一個匿名向量,只是不帶值。在製作完成後添加它們,然後在施工後添加它們。輔助函數的確是C++ 03中最好的方法。 –

2

#put something here# = vector<int>{1,2}

我很驚訝,雖然這{1,2}沒有工作。你沒有使用C++ 11編譯器嗎?如果沒有,那麼你只能在那裏創建帶有默認構造函數的向量(沒有值),或者先用數值填充它,然後將其保存。

+0

'vector'也有一個構造函數,它將創建一個具有相同初始值的n個副本的新向量。 – mkb

+0

我的編譯器是Code :: Blocks 10.05,你的建議對我不起作用。我猜測它不能用我的編譯器完成。 – Akavall

+0

@Aavall,這是你的IDE。它使用一些舊版本的GCC和下載鏈接,因此您必須手動升級編譯器和庫。 – chris

12

如果你想要一個空的載體,你可以這樣做:

mymap.insert(pair<int,vector<int> >(10, vector<int>())); 

然後,您可以添加你想要的東西,如一切元素:

mymap[10].push_back(1); 
mymap[10].push_back(2); 

編輯:刪除不正確說法,即矢量將在地圖增長時被複制。正如評論者所指出的,對於基於節點的std :: map來說,情況並非如此。

+0

'map's按值存儲是,但增長地圖將永遠不會複製鍵/值對。期。永遠。所以把它放在裏面。與'list','set','multimap'和'multiset'一樣。由於此屬性,它們被稱爲「基於節點的容器」。 –

+0

你的答案從'But'開始是錯誤的,這是相當多的。越來越多的「地圖」不會**暗示移動其內容。永遠。 「map」的一個不幸的(1)要求是,一旦設置了一個元素,它就不會移動,直到它被擦除。 (1)不幸的,因爲它來源於一個已知的實現,而不是從最初的原則(關於容器的作用)中想出來的,並且比紅黑樹如B樹阻止更有效的實現。 –

5

如果您正在使用C++ 11可以使用矢量的初始化列表constructor(在列表中的最後一個構造函數),這將是這樣的:

mymap.insert(pair<int, vector<int> > (10, {1, 2, 3})); 

如果您只能使用C++ 03, vector有一個構造函數,它爲每個元素提供一個大小和一個默認值,可能對您來說已經足夠了。否則,你將不得不構建矢量然後插入它。如果你想避免向量的unnessicary拷貝插入時,你可以swap它像這樣:

vector<int> myvec; 
myvec.push_back(1); 
myvec.push_back(2); 
mymap[10].swap(myvec); 

這樣的載體不需要複製。你會得到一個額外的矢量默認構造,但這不是很昂貴。

1

這應該在C++ 2003編譯器中工作。

#include <iostream> 
#include <vector> 
#include <map> 
#include <cassert> 

using namespace std; 

std::vector<int> make_vector(int a, int b) { 
    std::vector<int> result; 
    result.push_back(a); 
    result.push_back(b); 
    return result; 
} 

int main() 

{ 

    map <int, vector<int> > mymap; 

    mymap.insert(make_pair(10, make_vector(1,2))); 
    // Or, alternatively: 
    // mymap[10] = make_vector(1,2); 

    assert(mymap[10][0] == 1); 
    assert(mymap[10][1] == 2); 

    return 0; 
} 
1

C++ 03沒有初始化列表,這可能會使初始化集合時感到很痛苦。

如果無法升級到更新版本的編譯器,則始終可以使用Boost.Assignment庫。它有一個list_of函數正是爲此。

#put something here# -> boost::assign::list_of(1)(2)