vector插入/删除元素
插入操作:
理论知识
² 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
- #include <iostream>
- using namespace std;
- #include "vector"
- void printV(vector<int> &v)
- {
- for (int i = 0; i < v.size();i++)
- {
- cout <<v[i]<< " ";
- }
- cout << endl;
- }
- //插入操作
- void main1()
- {
- vector<int> v1;
- v1.insert(v1.begin(),1);//在开始位置插入元素1
- printV(v1);
- v1.insert(v1.begin(),2,33);//在开始位置插入两个33
- printV(v1);
- v1.insert(v1.begin(),v1.begin(),v1.end());//在开始位置插入整个区间元素
- printV(v1);
- }
- int main()
- {
- cout << "插入操作:" << endl;
- main1();
- return 0;
- }
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
- #include <iostream>
- using namespace std;
- #include "vector"
- void printV(vector<int> &v)
- {
- for (int i = 0; i < v.size();i++)
- {
- cout <<v[i]<< " ";
- }
- cout << endl;
- }
- //删除操作
- void main2()
- {
- vector<int> v1(10);
- for (int i = 0; i < v1.size(); i++)
- {
- v1[i] = i + 1;
- }
- printV(v1);
- v1.erase(v1.begin(),v1.begin()+4);//区间删除
- printV(v1);
- v1.erase(v1.begin());//头部删除
- printV(v1);
- v1[0] = 23;
- v1[1] = 22;
- printV(v1);
- for (vector<int>::iterator it = v1.begin(); it != v1.end();)//删除容器里等于8的元素
- {
- if (*it == 8)
- {
- it = v1.erase(it);
- }
- else
- it++;
- }
- printV(v1);
- }
- int main()
- {
- cout << "删除操作:" << endl;
- main2();
- return 0;
- }
以下是扩展部分:
实战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插入/删除元素相关推荐
- 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化
1.插入元素 (1)对于vector.string来说,当在某个位置插入元素后,如果内存空间重新分配,则指向任何位置的迭代器.指针.引用都会失效: 如果内存空间没有重新分配,则在插入位置之前的迭代器. ...
- deque插入/删除元素
deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数.表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数. 表 1 和添加或删除 ...
- STL中map/vector的删除元素操作
在我们使用C++中的STL的时候,可以使用迭代器iterator进行遍历,但是当我们通过iterator对vector和map删除元素的时候,要格外的小心,往往操作不当,导致iterator失效,后果 ...
- vector中删除元素后,如何有效的释放无效元素的内存
.erase()只是删除了元素内容,并不能改变容量大小: 举例: 35 void testvector() 36 { 38 vector v; 39 v.push_back(1); 4 ...
- D3 插入删除元素元素
插入元素 append():在选择集末尾插入元素 insert():在选择集前面插入元素 <html> <body> <p>1</p><p> ...
- 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 ...
- 【c++】vector中删除元素
1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以 ...
- C++ vector之删除元素
---- 向量容器vector的成员函数pop_back()可以删除最后一个元素. ---- 而函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围的元素. ---- 还 ...
- jq添加插入删除元素
https://www.cnblogs.com/sandraryan/ append() - 在被选元素的结尾插入内容 <body><div class="wrap&quo ...
最新文章
- 二进制安装mysql集群_基于二进制安装Cloudera Manager集群
- [LeetCode]题解(python):011-Container With Most Water
- Cpp拾零(to be continued)
- DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(六)
- Nginx中浏览器缓存的相关概念
- python闭包怎么理解_Python:闭包的理解
- win32项目-最基础的窗口程序
- linux中如何运行html文件路径问题,Linux中如何查询运行文件的全路径的方法
- 一些在Android中的小设置~~~持续添加
- java应用程序如何编译运作_开发Java应用程序的基本步骤是: 1 编写源文件, 2.编译源文件, 3.运行程序。_学小易找答案...
- 解决M1的mac打开JD-GUI报错问题(超简单)
- 【论文浅读】《Deep Pyramidal Residual Networks for Spectral–Spatial Hyperspectral Image Classification》
- Java并发 JUC 一文快速入门
- 使用OpenVINO部署ONNX模型
- SDCC 2017·深圳站八大不容错过的理由
- verilog幂次方_2的幂次方均值滤波的FPGA实现
- Linux系统中UID和GID详解
- LinuxC++开发面试系列(二):权限修改、进程管理与vim
- iOS - 手动下架的应用后快速恢复上架
- 【牛客】摩拜2018校招数据分析工程师笔试解析
热门文章
- 如何将.FRM,.MYD,MYI文件转换为.SQL导入数据库中
- 【数据结构与算法】之深入解析“K个逆序对数组”的求解思路与算法示例
- 【数据结构与算法】之深入解析“K个一组翻转链表”的求解思路与算法示例
- 2020年第十一届蓝桥杯 - 省赛 - Python大学组 - G. 单词分析
- 以下关于单模光纤的说法中,正确的是( )
- 210. 课程表 II
- Makefile 学习 1
- 机器学习、人工智能 博文链接汇总
- 【Tools】Visual Studio 2010下载和安装
- 【Tools】VMware Workstation 15.5 Pro安装详解