Итерация:
Все стандартные контейнеры имеют iterators
, которые обеспечивают упорядоченный доступ к элементам контейнеров. Они также могут использоваться в универсальных алгоритмах, которые работают с любым соответствующим типом итератора.
Вставка:
У всех последовательностей и ассоциативных контейнеров могут быть элементы, вставленные в них выражением c.insert(i, x)
- где c
является последовательностью или ассоциативным контейнером, i
является итератором в c
, а x
является значением что вы хотите добавить к c
.
std::inserter
и друзья могут использоваться для добавления элементов в последовательность или ассоциативный контейнер общим способом.
Удаление:
Для любой последовательности или ассоциативного контейнера работает следующий код:
while (true) {
X::iterator it(std::find(c.begin(), c.end(), elem));
if (it == c.end()) break;
c.erase(it);
}
Где X
- это тип контейнера, c
- это объект контейнера, а elem
- это объект со значением, которое вы хотите удалить из контейнера.
Для последовательностей есть идиома удаления-удаления, которая выглядит следующим образом:
c.erase(std::remove(c.begin(), c.end(), elem), c.end());
Для ассоциативных контейнеров вы также можете сделать:
c.erase(k);
Где k
- это ключ, соответствующий элементу, который вы хотите стереть.
Приятный интерфейс для всего этого:
См. Boost.Range .
Примечание - они могут быть заменены во время компиляции, а java - во время выполнения. Чтобы разрешить подстановку во время выполнения, необходимо использовать стирание типа (то есть создать шаблонный подкласс, который перенаправляет требуемый интерфейс в контейнер, с которым он создается).