Общие операции над контейнерами C ++ - PullRequest
12 голосов
/ 07 июня 2011

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

Ответы [ 3 ]

21 голосов
/ 07 июня 2011

Итерация:

Все стандартные контейнеры имеют 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 - во время выполнения. Чтобы разрешить подстановку во время выполнения, необходимо использовать стирание типа (то есть создать шаблонный подкласс, который перенаправляет требуемый интерфейс в контейнер, с которым он создается).

9 голосов
/ 07 июня 2011

Посмотрите на заголовок <algorithm>.Существует множество универсальных алгоритмов поиска, сортировки, подсчета, копирования и т. Д., Которые работают с чем угодно, обеспечивая итераторы с различными заданными характеристиками.

8 голосов
/ 07 июня 2011

C ++ имеет std::inserter и друзей для добавления элементов в контейнер общим способом.Они находятся в заголовочном файле iterator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...