vector<int> first;//Size()==2
first.push_back();
first.push_back();
//first.insert(2); vector<int>second;//Size()==3 + assign??
second.push_back();
second.push_back();
second.push_back();
vector<int>::iterator it = first.begin();
//second.assign(it,first.end());
second.insert(second.end(),first.begin(),first.end()); printf("first.size=%d\n", first.size());
printf("second.size=%d\n", second.size());
for (it = second.begin(); it != second.end(); it++)
printf("second[]=%d\n", *it);

second 要插入first的内容,太长了。好麻烦。怎么就没有直接 push_back(vector) 的 重构函数呢??

emplace 是C++11 里的 ,感觉跟这个 insert用法是一样的啊。

assign 是完全替换的意思。 直接用 operator = 难道不就OK了么?

reserve是修改vector目前数组 的大小。配套的是capacity()方法。获取数组的大小。

resize是修改vector 内容的。配套的是size()方法。获取数据的个数。 size() <= capacity();

--------------

真想把 www.cplusplus.com 这个网站给抓下来,然后自己做一个站点。

它没有评论;有些示例 非常不好。

补充 vector 进行iterator 且 erase删除元素的注意事项

==============================

【1】 首先,了解vector是数组,删除元素 会把后面的元素前移。

for( iterator it =XX.begin();it!=XX.end();it++){...}

【2】这里的it++ 只是 从前一个数组元素 移动到后一个数组元素,一般都是比较连续的地址,跟 vector<>里面的元素大小有关。

【3】而且for循环中 it!=XX.end() 这个条件 是一个坑,因为 它 不是实时的,当元素删除后,XX.end() 的值(地址) 应该会变动,但是for循环中 不会。所以 for循环 中间的条件 最好 在 for循环内 代码区域 进行判断,则是实时的【我的描述能力实在有限,只能这么说了】。

【4】可以使用 reverse_iterator 配合 erase 进行删除就安全一点

下面给一个例子:

#include <stdio.h>
#include <vector>
using namespace std; void iteratorVector(vector <int>&vInts){
int i = ;
for (vector<int>::iterator it = vInts.begin(); it != vInts.end(); it++){
printf("\t[%d] => %d\n", i++, *it);
}
printf("===== End Iterator Vector ====\n");
} void test_erase(vector<int>&vInts, int nId)
{
for (vector<int>::iterator it = vInts.begin(); it != vInts.end(); it++){
if (*it == nId){
it = vInts.erase(it);
return;
}
}
} void test_reverse_iterator_vector(vector<int> & vInts)
{
    //这里的 rbegin 应该 和 iterator 的end() 类似;
//这里的 rend 应该 和 iterator 的 begin() 类似;
for (vector<int>::reverse_iterator it = vInts.rbegin(); it != vInts.rend(); it++){
        test_erase(vInts, *it);
iteratorVector(vInts);
}
    return;
//==== 等效代码 ====
for (vector<int>::iterator it = vInts.end();;){
if (it == vInts.begin())break;
it--;
test_erase(vInts, *it);
iteratorVector(vInts);
}
}

int main()
{
vector<int> playingUserID;
playingUserID.push_back();
playingUserID.push_back();
playingUserID.push_back();
playingUserID.push_back();
playingUserID.push_back(); iteratorVector(playingUserID);
test_reverse_iterator_vector(playingUserID); }
/*
运行结果:符合预期
-------------- test_vector_rbegin_with_erase.obj
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
===== End Iterator Vector ====
[0] => 1
[1] => 2
[2] => 3
[3] => 4
===== End Iterator Vector ====
[0] => 1
[1] => 2
[2] => 3
===== End Iterator Vector ====
[0] => 1
[1] => 2
===== End Iterator Vector ====
[0] => 1
===== End Iterator Vector ====
===== End Iterator Vector ==== */

【5】如果要结合 iterator 与erase进行删除,那么要这么写代码:

void test_iterator_vector(vector<int> & vInts)
{
for (vector<int>::iterator it = vInts.begin(); ; ){
if (it == vInts.end())break; test_erase(vInts, *it); iteratorVector(vInts);
}
}
/*
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
===== End Iterator Vector ====
[0] => 2
[1] => 3
[2] => 4
[3] => 5
===== End Iterator Vector ====
[0] => 3
[1] => 4
[2] => 5
===== End Iterator Vector ====
[0] => 4
[1] => 5
===== End Iterator Vector ====
[0] => 5
===== End Iterator Vector ====
===== End Iterator Vector ====
*/

这里没有了 it ++  ,因为 erase删除后,后面的元素 前移,那么 it 刚才所指向的地址 ,现在 就是后一个元素了,刚好用到,就不需要 it ++ -- 了。

顺便说下: it=vInts.erase(it); 这样 也是OK 的!!!!!

【6】 最后要说的就是 STL 中的vector 以及其他容器 都是 非线程安全的,使用 iterator 迭代器 ,和 插入元素 不进行 加锁控制,会导致严重的问题。

所以最好 自己 写一个 继承了 Mutex 功能的类的容器,使用stl 也就是这点风险了。

vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项的更多相关文章

  1. vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 v ...

  2. STL—— 容器(vector)数据插入insert()方法 的返回值

    vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...

  3. emplace与insert的区别(C++11)

    转自时习之 C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace. 比如如果你想要向 std::ve ...

  4. 用vector容器代替数组 ——使用数组初始化vector对象

    在C++中,我们不能用数组直接初始化另一数组,而只能创建新的数组,然后显式的把原数组的元素逐个复制给新的数组. 按照C语言中的做法: const size_t arry_size=6; int int ...

  5. 【转】vector中erase()的使用注意事项

    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Whe ...

  6. C++中标准容器Vector,元素操作.insert()小结

    insert() 函数有以下三种用法: iterator insert( iterator loc, const TYPE &val );  //在指定位置loc前插入值为val的元素,返回指 ...

  7. C++中使用vector.erase()需要注意的事项

    本人菜鸟一枚.. 今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净. 举个栗子: vector<int> num_vec; num_vec.p ...

  8. 18. Word Ladder && Word Ladder II

    Word Ladder Given two words (start and end), and a dictionary, find the length of shortest transform ...

  9. 【JAVA、C++】LeetCode 018 4Sum

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

随机推荐

  1. Java 测试URL地址是否能正常连接

    public static int testWsdlConnection(String address) throws Exception { int status = 404; try { URL ...

  2. linux /usr/bin/ld: cannot find -lxxx

    在linux环境编译应用程式或lib的source code时出现如下错误:/usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source code 而有不同的 ...

  3. PHP 输出缓冲控制(Output Control) 学习

    php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者 ...

  4. 读取XML文件的节点内的内容

    <?xml version="1.0" encoding="utf-8" ?> <data> <tag3>15</ta ...

  5. 1064. Complete Binary Search Tree (30)

    分析: 考察BST + 完全二叉树的性质,注意: (1):先用排序排好,然后由于是完全二叉树,我们使用中序来建树. (2):建好之后,层次遍历可以采用队列. #include <iostream ...

  6. mysql远程连接:ERROR 1130 (HY000): Host '*.*.*.*' is not allowed to connect to this MySQL server解决办法

    安装完MySQL后,远程连接数据库的时候,出现 ERROR 1130 (HY000): Host '192.168.0.1' is not allowed to connect to this MyS ...

  7. 两个不等式(Nopier)

  8. linux-6的yum软件仓库

    yum命令 命令 作用 yum repolist all  列出所有仓库 yum list all  列出仓库中的所有软件包 yum  info 软件包名称  查看软件包信息 yum install  ...

  9. 《Linux内核设计与实现》读书笔记(十八)- 内核调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  10. 开源免费ERP/CRM/SCM:iDempiere 2.0 安装配置

    首先简单介绍一下iDempiere:iDempiere是一款Java平台的基于Compiere/ADempiere的​开源企业级开源ERP/CRM/SCM系统​, 由于是在ADempiere基础上用O ...