我看过使用std::back_inserter
的std :: copy,但是我使用了std::end
,两者都可以。我的问题是,如果std::back_inserter
做得很好,为什么需要std::end()
。
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
// Declaring first container
vector<int> v1 = { 1, 2, 3 };
// Declaring second container for
// copying values
vector<int> v2 = { 4, 5, 6 };
// Using std::back_inserter inside std::copy
//std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); // works
std::copy(v1.begin(), v1.end(), v2.end()); // also works
// v2 now contains 4 5 6 1 2 3
// Displaying v1 and v2
cout << "v1 = ";
int i;
for (i = 0; i < 3; ++i) {
cout << v1[i] << " ";
}
cout << "\nv2 = ";
for (i = 0; i < 6; ++i) {
cout << v2[i] << " ";
}
return 0;
}
答案 0 :(得分:6)
第一个将值插入向量中,另一个是未定义行为,它将项目直接插入向量的末端之后。
尝试打印结果矢量:
std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); // works
for (auto x : v2) cout << " " << x;
cout << endl;
打印
4 5 6 1 2 3
而
std::copy(v1.begin(), v1.end(), v2.end());
for (auto x : v2) cout << " " << x;
cout << endl;
打印
4 5 6
(在“调试”模式下会引发断言失败)
它在您的特定编译器中为您工作的事实并不正确。上班是UB的典型表现。