Как добавить элементы в контейнер, имеющий только итератор? - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть пустой контейнер с зарезервированной памятью. Моя функция (алгоритм) не берет контейнер, только итератор, чтобы начать его. Как добавить элементы в контейнер в этой функции? Мне нужно выделить память и вызвать конструктор, но как вызвать конструктор на месте, на которое ссылается итератор?

Ответы [ 4 ]

4 голосов
/ 01 апреля 2012

Обычно, используя что-то вроде std::inserter_iterator. Это, однако, обычно не устраняет необходимость указателя или ссылки на контейнер - оно просто хранит эту ссылку внутри самого итератора.

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

3 голосов
/ 01 апреля 2012

Вы не можете изменить контейнер, имея только обходной итератор; однако вместо этого вы можете использовать итератор вставки.

Отредактировано: Если вы резервируете память, вы должны знать, сколько элементов она будет содержать. Затем вы можете добавить пустые элементы перед переходом в функцию и заполнить их с помощью итератора, увеличивая его. После этого вы можете вернуть этот итератор, и он укажет на позицию, где заканчиваются полезные данные.

3 голосов
/ 01 апреля 2012

C ++ имеет концепцию insert_iterator, что, я полагаю, вам нужно?

, например:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    int my_array[] = { 1,2,3,4,5,6,7,8,9,10 };
    std::vector<int> my_vector;

    std::copy( std::begin( my_array ),
               std::end( my_array ),
               std::back_inserter( my_vector ) );
}
2 голосов
/ 01 апреля 2012

Нельзя вставить элемент в контейнер без ссылки / указателя на этот контейнер.

Однако вы можете перезаписать элемент (при условии, что у вас нет const_iterator).Что-то вроде:

*it = T(params);

, где T - это рассматриваемый тип.

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