📜  C++中的std :: back_inserter

📅  最后修改于: 2021-05-30 15:38:21             🧑  作者: Mango

std :: back_inserter构造一个向后插入的迭代器,该迭代器在要应用它的容器的末尾插入新元素。它在头文件中定义

反向插入迭代器是输出迭代器的一种特殊类型,其设计目的是使通常会覆盖元素(例如副本)的算法能够在容器的末尾自动插入新元素。

句法:

std::back_inserter (Container& x);

x: Container in which new elements will 
be inserted at the end.

Returns: A back_insert_iterator that inserts 
elements at the end of container x.
// C++ program to demonstrate std::back_inserter
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    // Declaring first container
    vector v1 = { 1, 2, 3 };
  
    // Declaring second container for
    // copying values
    vector v2 = { 4, 5, 6 };
  
    // Using std::back_inserter inside std::copy
    std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
    // 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;
}

输出:

v1 = 1 2 3
v2 = 4 5 6 1 2 3

有什么帮助?

  • 无需事先知道容器的大小:这种函数可能非常有用的一种情况是,当我们不知道容器的大小时,即要向其中插入多少个元素,因此一种方法是使该容器具有极大的尺寸,但是最有效的方法是在这种情况下使用std :: back_inserter()而不声明容器的尺寸。
    // C++ program to demonstrate std::back_inserter
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        // Declaring first container
        vector v1 = { 1, 2, 3 };
      
        // Declaring second container without specifying
        // its size
        vector v2;
      
        // Using std::back_inserter inside std::copy
        std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
        // v2 now contains 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 < 3; ++i) {
            cout << v2[i] << " ";
        }
      
        return 0;
    }
    

    输出:

    v1 = 1 2 3
    v2 = 1 2 3
    

    说明:在这里,我们必须将v1复制到v2,但是让我们说在某些情况下,我们不知道将多少元素复制到v2中,因此我们将不指定其大小,以后再使用std :: back_inserter复制到其中()。

    为什么不使用v2.begin()代替back_inserter()?你们中许多人会认为为什么我们不使用v2.begin()代替std :: back_inserter(v2),所以您需要重新考虑一下,因为我们没有声明v2的大小,因此,没有元素,因此不会有任何开头,因此v2.begin()会在此处引发错误。

要记住的要点:

  1. std :: back_inserter的陷阱之一是它只能与将push_back作为其方法之一的那些容器一起使用,例如在矢量,列表和双端队列的情况下。
  2. push_back()vs back_inserter():现在,您可能会认为push_back()和back_inserter相似,但两者并不相似。当必须在算法中传递迭代器时,则应像上述情况一样使用back_inserter,而对于通常在容器末尾插入值的情况,可以使用push_back()。
  3. 代替使用std :: back_inserter,我们可以创建一个back_insert_iterator ,然后最终使用它,std :: back_inserter仅返回back_insert_iterator。
    // C++ program to demonstrate back_insert_iterator
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        // Declaring first container
        vector v1 = { 1, 2, 3 };
      
        // Declaring second container for
        // copying values
        vector v2 = { 4, 5, 6 };
      
        // Declaring a back_insert_iterator
        std::back_insert_iterator > back_i1(v2);
      
        // Using the iterator in the copy()
        std::copy(v1.begin(), v1.end(), back_i1);
        // 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;
    }
    

    输出:

    v1 = 1 2 3
    v2 = 4 5 6 1 2 3
    
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”