2013-09-25 40 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)