2010-03-29 6 views
2
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <boost/array.hpp> 
#include <boost/bind.hpp> 

int main() { 
    boost::array<int, 4> a = {45, 11, 67, 23}; 
    std::vector<int> v(a.begin(), a.end()); 
    std::vector<int> v2; 
    std::transform(v.begin(), v.end(), v2.begin(), 
    boost::bind(std::multiplies<int>(), _1, 2)); 
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

При запуске это дает жуткую ошибку сегментации. Скажите, пожалуйста, где я ошибаюсь.Какая ошибка в следующем коде?

+2

попытался отладки? – Tom

+1

@Tom: Извините, но я новичок C++; мне понадобилось время, чтобы я был знаком со всеми крайними случаями в STL. – Johannes

+2

Что такое жуткая ошибка сегментации? – KevinDTimm

ответ

12

v2 имеет размер 0, если вы звоните transform. Вам придется либо изменить размеры v2 так, что он имеет, по крайней мере столько же элементов, как v перед вызовом transform:

v2.resize(v.size()); 

или вы можете использовать std::back_inserter в вызове transform:

std::transform(v.begin(), v.end(), std::back_inserter(v2), boost::bind(std::multiplies<int>(), _1, 2)); 
+0

И лучше всего, вероятно, для 'v2.reserve (v.size())' перед «преобразованием». – GManNickG

Смежные вопросы