插入操作:

理论知识

² vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

² vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。

² vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值

简单案例

vector<int> vecA;

vector<int> vecB;

vecA.push_back(1);

vecA.push_back(3);

vecA.push_back(5);

vecA.push_back(7);

vecA.push_back(9);

vecB.push_back(2);

vecB.push_back(4);

vecB.push_back(6);

vecB.push_back(8);

vecA.insert(vecA.begin(), 11); //{11, 1, 3, 5, 7, 9}

vecA.insert(vecA.begin()+1,2,33); //{11,33,33,1,3,5,7,9}

vecA.insert(vecA.begin() , vecB.begin() , vecB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}

测试代码:

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. #include "vector"
  4. void printV(vector<int> &v)
  5. {
  6. for (int i = 0; i < v.size();i++)
  7. {
  8. cout <<v[i]<< " ";
  9. }
  10. cout << endl;
  11. }
  12. //插入操作
  13. void main1()
  14. {
  15. vector<int> v1;
  16. v1.insert(v1.begin(),1);//在开始位置插入元素1
  17. printV(v1);
  18. v1.insert(v1.begin(),2,33);//在开始位置插入两个33
  19. printV(v1);
  20. v1.insert(v1.begin(),v1.begin(),v1.end());//在开始位置插入整个区间元素
  21. printV(v1);
  22. }
  23. int main()
  24. {
  25. cout << "插入操作:" << endl;
  26. main1();
  27. return 0;
  28. }

vector的删除

理论知识

² vector.clear(); //移除容器的所有数据

² vec.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。

² vec.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

简单案例:

删除区间内的元素

vecInt是用vector<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。

vector<int>::iterator itBegin=vecInt.begin()+1;

vector<int>::iterator itEnd=vecInt.begin()+2;

vecInt.erase(itBegin,itEnd);

//此时容器vecInt包含按顺序的1,6,9三个元素。

假设 vecInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素

for(vector<int>::iterator it=vecInt.being(); it!=vecInt.end(); )    //小括号里不需写  ++it

{

if(*it == 3)

{

it  =  vecInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。

//此时,不执行  ++it;

}

else

{

++it;

}

}

//删除vecInt的所有元素

vecInt.clear(); //容器为空

测试代码:

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. #include "vector"
  4. void printV(vector<int> &v)
  5. {
  6. for (int i = 0; i < v.size();i++)
  7. {
  8. cout <<v[i]<< " ";
  9. }
  10. cout << endl;
  11. }
  12. //删除操作
  13. void main2()
  14. {
  15. vector<int> v1(10);
  16. for (int i = 0; i < v1.size(); i++)
  17. {
  18. v1[i] = i + 1;
  19. }
  20. printV(v1);
  21. v1.erase(v1.begin(),v1.begin()+4);//区间删除
  22. printV(v1);
  23. v1.erase(v1.begin());//头部删除
  24. printV(v1);
  25. v1[0] = 23;
  26. v1[1] = 22;
  27. printV(v1);
  28. for (vector<int>::iterator it = v1.begin(); it != v1.end();)//删除容器里等于8的元素
  29. {
  30. if (*it == 8)
  31. {
  32. it = v1.erase(it);
  33. }
  34. else
  35. it++;
  36. }
  37. printV(v1);
  38. }
  39. int main()
  40. {
  41. cout << "删除操作:" << endl;
  42. main2();
  43. return 0;
  44. }

以下是扩展部分:

实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())

一蓑烟雨1989 2015-12-19 18:07:00  6934  收藏 3
分类专栏: C++ 实战c++中的vector系列
版权
前面提到的emplace_back就是C++11所增加的内容。

所以这篇博客就是想罗列一下C++11对vector容器的扩充。

std::vector::cbegin和std::vector::cend
这两个方法是与std::vector::begin和std::vector::end相对应的,从字面就能看出来,多了一个’c’,顾名思义就是const的意思。
所以:
std::vector::cbegin: Returns a const_iterator pointing to the first element in the container.
std::vector::cend: Returns a const_iterator pointing to the past-the-end element in the container.

#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector = {10,20,30,40,50};std::cout << "myvector contains:";for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
Output:
myvector contains: 10 20 30 40 50

std::vector::crbegin和std::vector::crend
这两个方法就不解释了,与上面的相比就是多了个’r’, reverse的缩写,反转迭代器,代码就省略了。

std::vector::emplace
之前已经对emplace_back进行了讨论,其实还有一个方法叫emplace。
我想说的就是,emplace之于emplace_back就像insert之于push_back。
看英文描述就直观:

emplace:Construct and insert element
emplace_back:Construct and insert element at the end

如何使用:

#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector = {10,20,30};auto it = myvector.emplace ( myvector.begin()+1, 100 );myvector.emplace ( it, 200 );myvector.emplace ( myvector.end(), 300 );std::cout << "myvector contains:";for (auto& x: myvector)std::cout << ' ' << x;std::cout << '\n';return 0;
}

Output:
myvector contains: 10 200 100 20 30 300

std::vector::data
Returns a direct pointer to the memory array used internally by the vector to store its owned elements.

#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector (5);int* p = myvector.data();*p = 10;++p;*p = 20;p[2] = 100;std::cout << "myvector contains:";for (unsigned i=0; i<myvector.size(); ++i)std::cout << ' ' << myvector[i];std::cout << '\n';return 0;
}
Output:
myvector contains: 10 20 0 100 0

std::vector::shrink_to_fit
Requests the container to reduce its capacity to fit its size.
就是减少空间

#include <iostream>
#include <vector>
int main ()
{std::vector<int> myvector (100);std::cout << "1. capacity of myvector: " << myvector.capacity() << '\n';std::cout << "1. size of myvector: " << myvector.size() << '\n';myvector.resize(10);std::cout << "2. capacity of myvector: " << myvector.capacity() << '\n';std::cout << "2. size of myvector: " << myvector.size() << '\n';myvector.shrink_to_fit();std::cout << "3. capacity of myvector: " << myvector.capacity() << '\n';std::cout << "3. size of myvector: " << myvector.size() << '\n';return 0;
}
//输出
1. capacity of myvector: 100
1. size of myvector: 100
2. capacity of myvector: 100
2. size of myvector: 10
3. capacity of myvector: 10
3. size of myvector: 10
#include <iostream>
#include <string>
#include <vector>
using namespace std;struct Foo{
public:Foo () = default;Foo(int n,double x):id(n),price(x){}void print()const{cout << "id is:"  << id;cout << ";price is:" << price << ".";}
private:int id =  110;double price = 1.123;
};
typedef vector<Foo> VECTORFOO;
void print(const VECTORFOO &);
int main()
{VECTORFOO v;v.emplace(v.begin(),42,3.1416);v.emplace(v.begin(),Foo(43,3.1417));// v.insert(v.begin(),{44,3.1418});v.emplace_back(Foo(44,3.1418));v.emplace_back(Foo(45,3.1419));v.emplace(v.end(),Foo(46,3.1420));print(v);return 0;
}void print(const VECTORFOO & vec)
{  int i = 1;for(VECTORFOO::const_iterator it = vec.begin() ; it != vec.end(); ++it){cout << "Elem " << i <<" is:";(*it).print();cout << endl;++i;}}r@r-Sys:~/9/delete_and_add_element$ ./123
Elem 1 is:id is:43;price is:3.1417.
Elem 2 is:id is:42;price is:3.1416.
Elem 3 is:id is:44;price is:3.1418.
Elem 4 is:id is:45;price is:3.1419.
Elem 5 is:id is:46;price is:3.142.

vector插入/删除元素相关推荐

  1. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化

    1.插入元素 (1)对于vector.string来说,当在某个位置插入元素后,如果内存空间重新分配,则指向任何位置的迭代器.指针.引用都会失效: 如果内存空间没有重新分配,则在插入位置之前的迭代器. ...

  2. deque插入/删除元素

    deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数.表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数. 表 1 和添加或删除 ...

  3. STL中map/vector的删除元素操作

    在我们使用C++中的STL的时候,可以使用迭代器iterator进行遍历,但是当我们通过iterator对vector和map删除元素的时候,要格外的小心,往往操作不当,导致iterator失效,后果 ...

  4. vector中删除元素后,如何有效的释放无效元素的内存

    .erase()只是删除了元素内容,并不能改变容量大小: 举例: 35 void testvector() 36 { 38     vector v; 39     v.push_back(1); 4 ...

  5. D3 插入删除元素元素

    插入元素 append():在选择集末尾插入元素 insert():在选择集前面插入元素 <html> <body> <p>1</p><p> ...

  6. C++ vector中删除元素

    vector中删除指定元素 //删除指定元素vector<int> v = {1,2,3,4,5,6,7,8,9,10,5,5,5};printf("v size:%d\n&qu ...

  7. 【c++】vector中删除元素

    1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以 ...

  8. C++ vector之删除元素

    ---- 向量容器vector的成员函数pop_back()可以删除最后一个元素. ---- 而函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围的元素. ---- 还 ...

  9. jq添加插入删除元素

    https://www.cnblogs.com/sandraryan/ append() - 在被选元素的结尾插入内容 <body><div class="wrap&quo ...

最新文章

  1. 二进制安装mysql集群_基于二进制安装Cloudera Manager集群
  2. [LeetCode]题解(python):011-Container With Most Water
  3. Cpp拾零(to be continued)
  4. DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(六)
  5. Nginx中浏览器缓存的相关概念
  6. python闭包怎么理解_Python:闭包的理解
  7. win32项目-最基础的窗口程序
  8. linux中如何运行html文件路径问题,Linux中如何查询运行文件的全路径的方法
  9. 一些在Android中的小设置~~~持续添加
  10. java应用程序如何编译运作_开发Java应用程序的基本步骤是: 1 编写源文件, 2.编译源文件, 3.运行程序。_学小易找答案...
  11. 解决M1的mac打开JD-GUI报错问题(超简单)
  12. 【论文浅读】《Deep Pyramidal Residual Networks for Spectral–Spatial Hyperspectral Image Classification》
  13. Java并发 JUC 一文快速入门
  14. 使用OpenVINO部署ONNX模型
  15. SDCC 2017·深圳站八大不容错过的理由
  16. verilog幂次方_2的幂次方均值滤波的FPGA实现
  17. Linux系统中UID和GID详解
  18. LinuxC++开发面试系列(二):权限修改、进程管理与vim
  19. iOS - 手动下架的应用后快速恢复上架
  20. 【牛客】摩拜2018校招数据分析工程师笔试解析

热门文章

  1. 如何将.FRM,.MYD,MYI文件转换为.SQL导入数据库中
  2. 【数据结构与算法】之深入解析“K个逆序对数组”的求解思路与算法示例
  3. 【数据结构与算法】之深入解析“K个一组翻转链表”的求解思路与算法示例
  4. 2020年第十一届蓝桥杯 - 省赛 - Python大学组 - G. 单词分析
  5. 以下关于单模光纤的说法中,正确的是( )
  6. 210. 课程表 II
  7. Makefile 学习 1
  8. 机器学习、人工智能 博文链接汇总
  9. 【Tools】Visual Studio 2010下载和安装
  10. 【Tools】VMware Workstation 15.5 Pro安装详解