2013-09-25 73 views
0

我有一個像 typedef map<int32_t,std::vector<int32_t>> myMap刪除從矢量值的關鍵

地圖我添加矢量值相對於關鍵像

myMap[somePointer->getVal()].push_back(Id1); 
myMap[somePointer->getVal()].push_back(Id2); 
myMap[somePointer->getVal()].push_back(Id3); 
myMap[somePointer->getVal()].push_back(Id4); 

如果我想刪除什麼密鑰的矢量值? 我試過 myMap[somePointer->getVal()].erase(Id1)

但是,這個編譯器哭着有錯誤。

+1

你知道multimap嗎? http://www.cplusplus.com/reference/map/multimap/ – Geoffroy

+1

告訴我們錯誤 – billz

+0

@billz:同意,錯誤總是有幫助的,應該是必需的。對於熟悉矢量接口的人來說,這個特殊情況很明顯,問題是試圖「擦除」一個值,而不是迭代器......但是:當請求編譯器錯誤時,請提供錯誤消息!* –

回答

1

嘗試此刪除x+1 th元素

myMap[somePointer->getVal()].erase (myMap[somePointer->getVal()].begin()+x);

0

documentation,Synopsys的是:

C++ 98:

iterator erase (iterator position); 
iterator erase (iterator first, iterator last); 

C++ 11:

iterator erase (const_iterator position); 
iterator erase (const_iterator first, const_iterator last); 

所以你必須給一個迭代器。

it = myMap[somePointer->getVal()].begin() + index; 
myMap[somePointer->getVal()].erase(it) 

您也可以嘗試使用multimap

0

向量並非專爲查找而設計的,因此該接口不基於值。如果你想從矢量中刪除,你需要知道位置。好處是您可以使用標準算法獲取位置。相當於你的代碼是:

auto& vector = myMap[somePointer->getVal()]; 
auto it = std::find(vector.begin(), vector.end(), Id1); 
if (it != vector.end()) { vector.erase(it); } 

正如你可以看到它比你原來的更長和更復雜。如果元素在矢量中的位置(即,如果您知道要刪除第一個/最後一個/第n個元素),則可以用std::find代替通過begin(),end()和迭代器算法獲得的正確迭代器。

+0

我試着做類似的事情。代碼被編譯。 std :: vector temp = myMap [somePointer-> getVal()]; std :: vector :: iterator it = std :: find(temp.begin(),temp.end(),Id); (it!= temp.end()) temp.erase(it); } 但我不確定這是否會從媒體中刪除Id。 我的向量很弱。 我試着做類似的事情。代碼被編譯。但我不確定這是否會給我正確的輸出。 – user2815287

+0

@ user2815287:打印矢量的內容並檢查它。 –

0

對於C++ 98或C++ 11時,erase有三個重載格式

C + 98

void erase (iterator position); 
size_type erase (const key_type& k); 
void erase (iterator first, iterator last); 

C++ 11

iterator erase (const_iterator position); 
size_type erase (const key_type& k); 
iterator erase (const_iterator first, const_iterator last); 

所以,你應該使用第二種格式如下刪除

myMap.erase(somePointer->getVal()); // getVal() must return a type convertible to maps key_type 

而不是

myMap[somePointer->getVal()].erase(Id1)