Подтвердить что ты не робот

Общие операции с контейнерами С++

Как написать общие операции в контейнерах STL STL? Например, Java имеет Collection интерфейс, который реализует каждый контейнер Java (за исключением карт). Я могу выполнять операции, такие как добавление, удаление, содержит итерации независимо от того, является ли фактический контейнер LinkedList, HashSet, ArrayBlockingQueue и т.д. Я нахожу его очень мощным. У С++ есть итераторы, но как насчет таких операций, как добавление и удаление? вектор имеет push_back, набор имеет вставку, очередь имеет push. Как добавить что-то в контейнер С++ общим способом?

4b9b3361

Ответ 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.