如何在遍历时擦除矢量地图

时间:2014-05-25 14:56:36

标签: vector map erase

我宣布了,

map<int, vector<int>> abcmap;
map<int,vector<int>>:: iterator itmap;

vector<int>SPLINKS;

SPLINKS包含:

1 3 4

abcmap包含;

1=> 1

2=> 2 6

3=> 1 2 4

我想迭代SPLINKS和abcmap来查找和删除两个容器中不匹配的元素;

即执行后;

2=>2 6     //not matched with either 1 or 3 or 4
我写了类似的东西;

for(itmap = abcmap.begin(); itmap != abcmap.end(); ++itmap)
{
cout << endl << itmap->first <<" => ";
for(size_t n=0; n<(*itmap).second.size(); n++)
{
for(itspl=SPLINKS.begin(); itspl!=SPLINKS.end(); ++itspl)
{
if((*itspl)==itmap->second[n])
{
    abcmap.erase(itmap);
}
}
}
}

但我得到调试断言失败了!。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

通过&#34;查找并删除两个容器中不匹配的元素&#34;我知道您要从地图中删除。无论哪种方式,都可以轻松修改代码以从SPLINKS中删除元素

以下是代码:

std::map<int, std::vector<int>> map;
std::vector<int> vector = {1, 3, 4};
map[0] = {1};
map[1] = {2, 6, 5};
map[2] = {1, 2, 4};

for(auto &pair: map) { // iterate map
    auto &currentvec = pair.second;
    std::vector<int> values;
    for(std::size_t i = 0; i < currentvec.size(); i++) { // iterate vectors of map
        bool contains = false;
        for(std::size_t j = 0; j < vector.size(); j++) { // iterate vector this be your SPLINKS
            if(currentvec[i] == vector[j]) {
            contains = true;
           }
        }
        if (!contains) {
            values.push_back(currentvec[i]);
        }
   }
   for(std::size_t i = 0; i < values.size(); i++) {
       currentvec.erase(std::remove(currentvec.begin(), currentvec.end(), values[i]), currentvec.end());
   }
}

for (auto &pair : map) { // iterate map
    auto &currentvec = pair.second;
    for (std::size_t i = 0; i < currentvec.size(); i++) {
        std::cout << currentvec[i] << " ";
    }
    std::cout << std::endl;
 }

标题必填:<map><vector><algorithm><iostream>