2016-04-11 2 views
0

Моей карты определяется следующим образом:ключа Erase, значение из карты по значению в C++

map<string, map<string, string>> _map; 

Но проблема, что придумал, что моя карта сначала в основном то же самое значение, т.е.

_map["key1"]["value1"] = "data1"; 
_map["key1"]["value2"] = "data2"; 
_map["key1"]["value3"] = "data3"; 
_map["key1"]["value4"] = "data4"; 
_map["key2"]["value5"] = "data5"; 

Так что, когда я хочу, чтобы удалить какой-либо конкретной (ключ, значение), я не могу использовать _map.find («key1») для итератора, поскольку он имеет повторяющиеся записи.

Есть ли способ установить индекс итератора, используя значение?

Предположим, что я хочу, чтобы удалить эту запись:

_map["key1"]["value4"] = "data4"; 

Как мне это сделать?

+0

Ваш вопрос непонятен. Кажется, вы спрашиваете, как удалить элемент с карты, что тривиально найти в документации. Не могли бы вы уточнить, в чем проблема, которую вы пытаетесь решить? – juanchopanza

+0

Вы не можете иметь более одного значения для ключа на карте. –

+0

@ A.Franzen: у него не более одного значения за ключ. посмотрите внимательно! – Nawaz

ответ

2

Наваз является правильным. Однако у него есть одна слабость: если вы удалите "value5", _map["key2"] по-прежнему будет содержать пустой map<string, string>. Это, вероятно, не то, что вы намереваетесь.

Чтобы исправить это, вы можете использовать pair шаблон и изменить тип _map быть:

map<pair<string, string>, string> _map; 

Ваши задания будут выглядеть так:

_map[make_pair("key1", "value1")] = "data1"; 
_map[make_pair("key1", "value2")] = "data2"; 
_map[make_pair("key1", "value3")] = "data3"; 
_map[make_pair("key1", "value4")] = "data4"; 
_map[make_pair("key2", "value5")] = "data5"; 

Затем вы можете удалить каждую запись например:

_map.erase(make_pair("key1", "value4")); 

Вы можете найти pair в заголовке <utility>.

+0

Будут ли его данные по-прежнему организованы в том же порядке, что и инициализация его, а не как он? Спросить, потому что я действительно не знаю. – Stephen

+0

Да, было бы.'std :: pair' определяет сравнение, которое сначала заказывается первой координатой, затем второй. –

+0

Erase дает мне ошибку. Он не распознает параметр. Я не могу удалить его так. Я также пробовал пропустить пару-тройку, все еще не работает. –

3

Просто erase это:

_map["key1"].erase("value4"); 

Обратите внимание, что он не бросает исключение, если ключ не существует — она возвращает 0 в этом случае.

BTW, вы можете улучшить инициализацию карты как: ответ

std::map<std::string, std::map<std::string, std::string>> _map 
{ 
    {"key1", { 
       {"value1", "data1"}, 
       {"value2", "data2"}, 
       {"value3", "data3"}, 
       {"value4", "data4"} 
      } 
    }, 
    {"key2", { 
       {"value5", "data5"} 
      } 
    } 
}; 
Смежные вопросы