Сегфоут по использованию преобразования на векторе указателей на абстрактный класс - PullRequest
1 голос
/ 26 июля 2010

У меня возникает ошибка по следующему коду:

У меня есть абстрактный класс A с методом

virtual bool Ok() const;

Теперь у меня есть следующий вектор

std::vector<A*> v;

заполнен несколькими указателями на существующие дочерние объекты.Я хочу собрать результаты метода Ok() следующим образом:

std::vector<bool> results;
std::transform(v.begin(), v.end(), results.begin(), std::mem_fun(&A::Ok));
std::accumulate(results.begin(), results.end(), true, std::logical_and<bool>());

К сожалению, я всегда получаю ошибку segfault во второй строке, и я не понимаю, почему.Замена вызова преобразования стандартным циклом C ++ исправляет ошибку.Есть идеи?

Ответы [ 2 ]

5 голосов
/ 26 июля 2010

Вектор results пуст, и transform не знает, что вы хотите поместить результаты в него, а не перезаписывать существующую последовательность.

Либо инициализируйте вектор results с правильным размером:

std::vector<bool> results(v.size());

или используйте итератор "back insert", чтобы поместить результаты в пустой вектор:

std::transform(v.begin(), v.end(), std::back_inserter(results), std::mem_fun(&A::Ok));
2 голосов
/ 26 июля 2010

Это может быть глупо, но я отвечу на свой вопрос напрямую.Я нашел проблему незадолго до того, как нажал «опубликовать свой вопрос», и подумал, что, поскольку я уже набрал все, я мог бы также опубликовать ответ, чтобы кто-то еще мог извлечь из него пользу:

Ответ таков:вектор results пуст и, следовательно, вставка в results.begin() довольно глупая вещь.Вместо этого используйте std::back_inserter(results) и все работает отлично!

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