Как написать общие операции в контейнерах STL STL? Например, Java имеет Collection интерфейс, который реализует каждый контейнер Java (за исключением карт). Я могу выполнять операции, такие как добавление, удаление, содержит итерации независимо от того, является ли фактический контейнер LinkedList, HashSet, ArrayBlockingQueue и т.д. Я нахожу его очень мощным. У С++ есть итераторы, но как насчет таких операций, как добавление и удаление? вектор имеет push_back, набор имеет вставку, очередь имеет push. Как добавить что-то в контейнер С++ общим способом?
Общие операции с контейнерами С++
Ответ 1
Итерация:
Все стандартные контейнеры имеют 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 - это время выполнения. Чтобы разрешить замещение во время выполнения, необходимо использовать стирание типа (то есть - создать шаблонный подкласс, который перенаправляет требуемый интерфейс в контейнер, с которым он создается).
Ответ 2
Посмотрите на заголовок <algorithm>
. Существует множество общих алгоритмов для поиска, сортировки, подсчета, копирования и т.д., Которые работают над тем, что обеспечивает итераторы с различными заданными характеристиками.
Ответ 3
С++ имеет std::inserter
и друзей, чтобы добавить элементы в контейнер общим способом. Они находятся в файле заголовка iterator
.