不需要std::copy
,也不需要一对迭代器。
只需这样做:
vector<int> copy_vec(vec); //use the copy constructor!
你完成了!
至于您的代码为什么会出错,是因为第一个迭代器std::copy
是 a const_iterator
,但第二个迭代器是iterator
. 两者必须是相同的类型,但它们不是,因此模板参数推导失败,因为std::copy
它是一个函数模板。
要通过示例理解这一点,请考虑以下简单代码:
template<typename T>
void f(T a, T b) {}
int main()
{
int a = 100;
char b = 'A';
f(a,b);
}
它给出了错误(见ideone):
prog.cpp:8: error: no matching function for call to ‘f(int&, char&)’
它无法编译,因为我们依赖于模板参数推导。由于函数模板中第一个参数和第二个参数的类型完全相同,但我们称这个函数传递a
(即int
)作为第一个参数,b
(即char
)作为第二个参数,它不能T
从不同类型的参数中唯一地推导!请注意,模板参数推导过程中不考虑转换。
但是,如果我们不依赖模板参数推导,而是显式提供模板参数,那么它会起作用(参见ideone):
f<int>(a,b); //works!
它的工作原理是不需要T
从函数参数中推断出来!
同样,如果您为 提供模板参数std::copy
,那么即使您的代码也可以工作(请参阅ideone):
std::copy<vector<int>::const_iterator>(i,vec.end(),back_inserter(copy_vec));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ explicitly provide template argument!
它之所以有效,是因为iterator
可以转换为const_iterator
,但const_iterator
不能转换为iterator
这意味着以下内容会出错(请参阅ideone):
std::copy<vector<int>::iterator>(i,vec.end(),back_inserter(copy_vec));
//^^^^^^^^^^^^^^^^^^^^^ non-const iterator!