为什么在std :: copy期间使用std :: back_inserter而不是end()?

时间:2019-01-21 20:54:23

标签: c++

我看过使用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; 
}

1 个答案:

答案 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的典型表现。