C ++ функция, которая берет OutputIterator и записывает в него - PullRequest
2 голосов
/ 24 января 2011

Я пытаюсь написать функцию C ++, которая берет OutputIterator и записывает в него значения, но у меня возникают различные проблемы.Когда я передаю итератор списка <>, список не заполняется, а когда я передаю итератор вектора <>, я получаю ошибку сегментации (в Linux).

Я следил за обсуждениями из "заполнение std :: [container] из функции путем передачи выходного итератора" и "Как написать функцию, которая принимает итератор или коллекцию универсальным образом?" .

Есть идеи?Я хотел бы вызвать код insertValues ​​() с помощью метода output () контейнера вывода, как и в случае с другими функциями STL, такими как std: copy ().

#include <cstdio>
#include <list>
#include <vector>

using namespace std;

template<typename OutputIterator>
void insertValues(OutputIterator result)
{
    for (int i = 0; i < 10; i++)
    {
        *(result++) = i;
    }
}

int main(int argc, char **argv)
{
    // This code produces 0 items in the list.
    list<int> values_list;
    insertValues(values_list.begin());
    printf("values has %d items\n", (int) values_list.size());

    // This code produces a seg fault.
    vector<int> values_vector;
    insertValues(values_vector.begin());
    printf("values has %d items\n", (int) values_vector.size());
}

1 Ответ

10 голосов
/ 24 января 2011

Ваш код ломается, потому что ни в списке, ни в векторе недостаточно элементов. Обратите внимание, что выходной итератор не добавляет элементов, он просто записывает в существующие элементы.

Таким образом, вы можете переписать его следующим образом:

template<typename Container>
void insertValues(Container &result)
{
    for (int i = 0; i < 10; i++)
    {
        result.push_back(i);
    }
}

и в main:

insertValues(values_list);
insertValues(values_vector);

В качестве альтернативы, вы можете использовать итератор, который выполняет операцию push_back. Это находится в стандартной библиотеке под именем back_inserter (#include <iterator>). Используя это, и не изменяя ваш insertValues код:

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