2016-11-16 3 views
0

У меня есть карта векторов в C++. Для каждого вектора я хотел бы удалить записи, удовлетворяющие определенному условию. Если вектор заканчивается пустым, я хотел бы удалить его с карты. Я знаю, что удаление может испортить итераторы, и повторное повторение делает это еще более запутанным для меня. Каков наилучший способ сделать это?Как перебирать карту векторов при удалении?

+0

Небольшой код контекст поможет здесь. – tadman

+0

Вообще говоря, полезно показать свои попытки, которые вы пробовали ... редко подходит для публикации вопроса, не включая некоторые из вашего кода. –

+4

Это дубликат http://stackoverflow.com/questions/8234779/how-to-remove-from-a-map-while-iterating-it – qexyn

ответ

4

Стандартный цикл Mutating Контейнер:

for (auto it = m.begin(); it != m.end();) 
{ 
    // work 

    if (/* need to delete */) // e.g "if (it->second.empty())" 
    { 
     it = m.erase(it); 
    } 
    else 
    { 
     ++it; 
    } 
} 
0

Вот показательная программа, которая показывает, как это можно сделать

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

int main() 
{ 
    std::map<int, std::vector<int>> m = 
    { 
     { 1, { 1, 2 } }, 
     { 2, { 2 } }, 
     { 3, { 3, 4 } }, 
     { 4, { 4 } } 
    }; 

    for (const auto &p : m) 
    { 
     std::cout << p.first << ": "; 
     for (int x : p.second) std::cout << x << ' '; 
     std::cout << std::endl; 
    } 

    for (auto it = m.begin(); it != m.end();) 
    { 
     it->second.erase(it->second.begin()); 

     if (it->second.empty()) it = m.erase(it); 
     else ++it; 
    } 

    std::cout << std::endl; 

    for (const auto &p : m) 
    { 
     std::cout << p.first << ": "; 
     for (int x : p.second) std::cout << x << ' '; 
     std::cout << std::endl; 
    } 

    return 0; 
} 

Выход программы

1: 1 2 
2: 2 
3: 3 4 
4: 4 

1: 2 
3: 4 
Смежные вопросы