2013-08-13 6 views
1

Что не так с copy (что является общей функцией), здесь? Я не могу запустить код.Невозможно использовать функцию копирования

vector<int> a(10, 2); 
vector<int> b(a.size()); 

auto ret = copy(a.begin(), a.end(), b); 

for (auto i : b) cout << i << endl; 

Вот результат после компиляции:

1>------ Build started: Project: Project1, Configuration: Debug Win32 ------ 
1> MainEx.cpp 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(2176): error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' 
1>   c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(2157) : see declaration of 'std::_Copy_impl' 
1>   c:\users\amin\documents\visual studio 2012\projects\project1\project1\mainex.cpp(40) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_iterator<_Myvec>,std::vector<_Ty>>(_InIt,_InIt,_OutIt)' being compiled 
1>   with 
1>   [ 
1>    _OutIt=std::vector<int>, 
1>    _Myvec=std::_Vector_val<std::_Simple_types<int>>, 
1>    _Ty=int, 
1>    _InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

ответ

7

std::copy третий параметр итератор, передать b.begin() вместо:

#include <iterator> 
... 

auto ret = std::copy(a.begin(), a.end(), b.begin()); 

Лучше всего построить b от a, в этом случае компилятор знает выделять всю необходимую память сразу и построить элементы из a:

vector<int> b(a.begin(), a.end()); 

или

std::vector<int> b = a; 
+0

+1 для второй части, но здесь он не нужен back_inserter. – Pubby

+0

или можете использовать 'vector b {a.begin(), a.end()};' с C++ 11 – P0W

+0

согласны оба, я пытался избежать insert to begin(), который перераспределяет элементы. – billz

2

Вы должны скопировать b.begin() в качестве третьего аргумента copy итератор, а не контейнер.

auto ret = copy(a.begin(), a.end(), b.begin()); 
4

Необходимо передать и такту, и вы передаете std::vector<int>. В вашем случае, вы должны пройти b.begin():

auto ret = copy(a.begin(), a.end(), b.begin()); 
//         ^^^^^^^ 

Конечно, простой способ добиться того же результата, будет

vector<int> b = a; 
3

auto ret = copy(a.begin(), a.end(), b.begin());

должен делать эту работу.

все аргументы std::copy должны быть итераторами.

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