2013-06-22 2 views
0

Есть ли встроенный метод, который удаляет и элемент (т. Е. От карты, заданной ключом) и возвращает удаленный элемент?C++: удалить элемент из контейнера и вернуть его

+1

Используйте [ 'at'] (http://en.cppreference.com/ w/cpp/container/map/at) для доступа к элементу, затем ['erase'] (http://en.cppreference.com/w/cpp/container/map/erase), чтобы удалить его (по его позиции) из контейнер. – 0x499602D2

+0

@ 0x499602D2 1. Я еще не использую C++ 11. 2. Это то, что я прошу, если мне нужно это сделать, если вы точно это знаете, вы можете добавить его в качестве ответа. – Subway

ответ

0

Для этого не существует встроенного метода, однако вы можете сохранить элемент, обратившись к нему, а затем удалите его. Для стирания требуется указать ключ. Если это мульти-карта, вы должны удалить ее с помощью позиции.

0

Вот функция, которую вы можете использовать (C++ 11):

#include <iostream> 
#include <map> 

template<typename T> 
typename T::mapped_type removeAndReturn(T& mp, const typename T::key_type& val) { 
    auto it = mp.find(val); 
    auto value = std::move(it->second); 
    mp.erase(it); 
    return value; 
} 

int main() { 
    std::map<int, int> m; 
    m[3] = 4; 
    std::cout << "Map is empty: " << std::boolalpha << m.empty() << std::endl; 
    std::cout << "Value returned: " << rm_and_return(m, 3) << std::endl; 
    std::cout << "Map is empty: " << std::boolalpha << m.empty() << std::endl; 
} 

Выход:

Map is empty: false 
Value returned: 4 
Map is empty: true