博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vector插入/删除元素
阅读量:315 次
发布时间:2019-03-04

本文共 6078 字,大约阅读时间需要 20 分钟。

插入操作:

理论知识

² 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]  

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

 

 

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]  

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

 

以下是扩展部分:

 

实战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 
#include
int main (){  std::vector
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 
#include
int main (){  std::vector
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 
#include
int main (){  std::vector
myvector (5);  int* p = myvector.data();  *p = 10;  ++p;  *p = 20;  p[2] = 100;  std::cout << "myvector contains:";  for (unsigned i=0; i

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

#include 
#include
int main (){  std::vector
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: 1001. size of myvector: 1002. capacity of myvector: 1002. size of myvector: 103. capacity of myvector: 103. size of myvector: 10

 

#include 
#include
#include
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
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$ ./123Elem 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.

 

你可能感兴趣的文章