📜  C++中的std :: inserter

📅  最后修改于: 2021-05-30 14:32:03             🧑  作者: Mango

std :: inserter构造一个插入迭代器,该插入迭代器在从x指向的位置开始的连续位置中,将新元素插入x中。它在头文件中定义

插入迭代器是输出迭代器的一种特殊类型,设计用于允许通常会覆盖元素(例如副本)的算法代之以在容器中的特定位置自动插入新元素。
句法:

std::inserter(Container& x, typename Container::iterator it);
x: Container in which new elements will 
be inserted.
it: Iterator pointing to the insertion point.

Returns: An insert_iterator that inserts elements into 
x at the position indicated by it.
// C++ program to demonstrate std::inserter
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    // Declaring first container
    deque v1 = { 1, 2, 3 };
  
    // Declaring second container for
    // copying values
    deque v2 = { 4, 5, 6 };
  
    deque::iterator i1;
    i1 = v2.begin() + 1;
    // i1 points to next element of 4 in v2
  
    // Using std::inserter inside std::copy
    std::copy(v1.begin(), v1.end(), std::inserter(v2, i1));
    // v2 now contains 4 1 2 3 5 6
  
    // 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 1 2 3 5 6 

有什么帮助?

  • 在任何地方插入值:现在,试想一下,如果我们必须将值复制到向量之类的容器中,首先,我们必须移动元素然后复制,但是借助std :: insert()我们可以在任何位置插入位置轻松。
    // C++ program to demonstrate std::inserter
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        // Declaring first container
        vector v1 = { 1, 2, 3, 7, 8, 9 };
      
        // Declaring second container
        vector v2 = { 4, 5, 6 };
      
        vector::iterator i1;
        i1 = v2.begin() + 2;
        // i1 points to next element of 5 in v2
      
        // Using std::inserter inside std::copy
        std::copy(v1.begin(), v1.end(), std::inserter(v2, i1));
        // v2 now contains 4 5 1 2 3 7 8 9 6
      
        // Displaying v1 and v2
        cout << "v1 = ";
      
        int i;
        for (i = 0; i < 6; ++i) {
            cout << v1[i] << " ";
        }
      
        cout << "\nv2 = ";
        for (i = 0; i < 9; ++i) {
            cout << v2[i] << " ";
        }
      
        return 0;
    }
    

    输出:

    v1 = 1 2 3 7 8 9
    v2 = 4 5 1 2 3 7 8 9 6
    

    说明:在这里,我们开始将v1复制到v2中,但不是从头开始,而是在v2的第二个位置之后,即5之后,因此将v1的所有元素都插入了5之后和6之前。珍惜我们想要的地方。

要记住的要点:

  1. std :: inserter的陷阱之一是它只能与那些将插入作为其方法之一的容器一起使用,例如在矢量,列表和双端队列等情况下。
  2. insert()vs std :: inserter():现在,您可能会认为insert()和std :: inserter()相似,但两者却不相似。当您必须在算法中传递迭代器时,则应像上述情况一样使用inserter(),而对于通常在容器中插入值的情况,可以使用insert()。
  3. 代替使用std :: inserter,我们可以创建一个insert_iterator然后再使用它,因为最终,std :: inserter仅返回insert_iterator。
    // C++ program to demonstrate insert_iterator
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        // Declaring first container
        deque v1 = { 1, 2, 3 };
      
        // Declaring second container for
        // copying values
        deque v2 = { 4, 5, 6 };
      
        deque::iterator ii;
        ii = v2.begin() + 1;
        // ii points after 4 in v2
      
        // Declaring a insert_iterator
        std::insert_iterator > i1(v2, ii);
      
        // Using the iterator in the copy()
        std::copy(v1.begin(), v1.end(), i1);
        // v2 now contains 4 1 2 3 5 6
      
        // 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 1 2 3 5 6
    
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”