• C++ Reference: Standard C++ Library reference: Containers: deque: deque: insert


    C++官网参考链接:https://cplusplus.com/reference/deque/deque/insert/

    公有成员函数 
    <deque>
    std::deque::insert
    C++98
    单个元素 (1)    
    iterator insert (iterator position, const value_type& val);
    填充 (2)    
    void insert (iterator position, size_type n, const value_type& val);
    范围 (3)    
    template void insert (iterator position, InputIterator first, InputIterator last);
    C++11
    单个元素 (1)    
    iterator insert (const_iterator position, const value_type& val);
    填充 (2)    
    iterator insert (const_iterator position, size_type n, const value_type& val);
    范围 (3)    
    template iterator insert (const_iterator position, InputIterator first, InputIterator last);
    移动 (4)    
    iterator insert (const_iterator position, value_type&& val);
    初始化列表 (5)    
    iterator insert (const_iterator position, initializer_list il);
    插入元素
    deque容器通过在指定位置的元素之前插入新元素来扩展。
    这将根据所插入元素的数量有效地增加容器的size
    deque设计为从序列的结束或开始高效地执行插入(和删除)。在其他位置插入通常比在listforward_list容器中效率低。
    形参决定插入多少元素以及初始化它们的值: 

    形参
    position 
    插入新元素的容器中的位置。
    iterator是成员类型,定义为指向元素的随机访问iterator(random access iterator)类型。
    val 
    值要复制(或移动)到插入的元素。
    成员类型value_type是容器中元素的类型,在deque中定义为其第一个模板形参(T)的别名。
    n
    要插入的元素数量。每个元素都初始化为val的副本。
    成员类型size_type是无符号整型。
    first,last 
    指定元素范围的iterator。范围[first,last)中的元素副本被插入到position(以相同的顺序)。
    注意,该范围包括firstlast之间的所有元素,包括first指向的元素,但不包括last指向的元素。
    函数模板实参InputIterator应该是一个输入iterator(input iterator)类型,它指向可以构造value_type对象的类型元素。
    il
    一个initializer_list对象。这些元素的副本插入position(以相同的顺序)。
    这些对象是由初始化列表声明器自动构造的。
    成员类型value_type是容器中元素的类型,在deque中定义为其第一个模板形参(T)的别名。

    返回值
    指向新插入的第一个元素的iterator。
    成员类型iterator是指向元素的随机访问iterator(random access iterator)类型。
    新元素的存储是使用容器的allocator分配的,这可能会在失败时抛出异常(对于默认allocator,如果分配请求不成功,则抛出bad_alloc)。

    用例
    // inserting into a deque
    #include
    #include
    #include

    int main ()
    {
      std::deque mydeque;

      // set some initial values:
      for (int i=1; i<6; i++) mydeque.push_back(i); // 1 2 3 4 5

      std::deque::iterator it = mydeque.begin();
      ++it;

      it = mydeque.insert (it,10);                  // 1 10 2 3 4 5
      // "it" now points to the newly inserted 10

      mydeque.insert (it,2,20);                     // 1 20 20 10 2 3 4 5
      // "it" no longer valid!

      it = mydeque.begin()+2;

      std::vector myvector (2,30);
      mydeque.insert (it,myvector.begin(),myvector.end());
                                                    // 1 20 30 30 20 10 2 3 4 5

      std::cout << "mydeque contains:";
      for (it=mydeque.begin(); it!=mydeque.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '\n';

      return 0;
    }
    输出:

    复杂度 
    在插入的元素(复制/移动构造)数量上是线性的。另外,根据特定的库实现,加上在positiondeque的结束处之一之间的元素数量中的一个额外的线性。

    iterator的有效性
    如果插入发生在序列的开始或结束处,则与此容器相关的所有iterator都将失效,但指针和reference仍然有效,指向调用之前所引用的相同元素。
    如果插入发生在deque的其他位置,则与此容器相关的所有iterator、指针和reference都将失效。

    数据竞争
    完成容器的修改。
    如果插入发生在序列的开始或结束处,则不会访问所包含的元素(参见上面的iterator的有效性)。
    如果它发生在其他地方,同时访问元素是不安全的。

    异常安全
    如果操作在beginend处插入单个元素,则在异常情况下容器中不存在任何更改(强保证)。
    否则,保证容器以有效状态结束(基本保证)。
    如果元素结构的适当实参不支持allocator_traits::construct,或者指定了无效的position或范围,则会导致未定义的行为。 

  • 相关阅读:
    30亿美元并购启示:中美CDM不再“萧规曹随”
    学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站
    MySQL 面试题
    【算法竞赛】【模式串匹配算法(KMP)】【附带模板题】
    【面试高频题】难度 3/5,可直接构造的序列 DP 题
    os.path.join函数用法
    格力售后官方电话 - (24小时全国客服中心)
    C++入门篇1
    Linux 中 man手册中函数后面括号数字释义
    【Linux】03_编译原理
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/127668967