vector 容器(二)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: vector 容器(二)

4.vector 的插入删除


.push_back()

.pop_back()

.insert(const_iterator pos,elem); //对应位置插入elem

.insert(const _iterator pos,int count,int elem) //对应位置插入count个elem

.erase(const_iterator pos); //删除对应位置

.erase(const _iterator begin(),const _iterator.end()) //删除[begin,end)的数

.clear() //删除全部数


插入与删除里面都是用迭代器


#include <iostream>
using namespace std;
#include <string>
#include <vector>
void PrintVector(vector<int>&v)  //打印vector中的数据
{
  for(vector<int>::iterator it = v.begin();it!= v.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<<endl;
}
void test01()
{
  vector<int> v;
  //尾插
  v.push_back(10);
  v.push_back(20);
  v.push_back(30);
  PrintVector(v);
  //尾删
  v.pop_back();
  PrintVector(v);
  //插入
  v.insert(v.begin(),0);
  PrintVector(v);
  //插入多个
  v.insert(v.begin(),2,10);
  PrintVector(v);
  //删除
  v.erase(v.begin());
  PrintVector(v);
  //v.erase(v.begin(),v.end());  //相当于清除
  v.clear();
  PrintVector(v);
}
int main()
{
  test01();
  system("pause");
  return 0;
}


运行结果:



———————————————————————————————————


5.vector 的数据存取


.at(int idx);

.operator[]

.front()

.back()


#include <iostream>
using namespace std;
#include <string>
#include <vector>
void PrintVector(vector<int>&v)  //打印vector中的数据
{
  for(vector<int>::iterator it = v.begin();it!= v.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<<endl;
}
void test01()
{
  vector<int> v;
  for(int i=0;i<10;i++)
  {
  v.push_back(i);
  }
  //利用[]访问
  for(unsigned int i=0;i<v.size();i++)
  {
  cout<<v[i]<<" ";
  }
  cout<<endl;
  //利用.at()访问
  for(unsigned int i=0;i<v.size();i++)
  {
  cout<<v.at(i)<<" ";
  }
  cout<<endl;
  //输出第一个
  cout<<v.front()<<endl;
  //输出最后一个位置上的
  cout<<v.back()<<endl;
}
int main()
{
  test01();
  system("pause");
  return 0;
}



结果:



———————————————————————————————————


6.vector的容器互换


1.两个容器中的数据交换

2.实际用途,巧用swap收缩


例1:普通两个容器数据交换


#include <iostream>
using namespace std;
#include <string>
#include <vector>
void PrintVector(vector<int>&v)  //打印vector中的数据
{
  for(vector<int>::iterator it = v.begin();it!= v.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<<endl;
}
void test01()
{
  vector<int> v;
  for(int i=0;i<10;i++)
  {
  v.push_back(i);
  }
  vector<int> v1;
  for(int i=9;i>=0;i--)
  {
  v1.push_back(i);
  }
  cout<<"交换前:"<<endl;
  PrintVector(v);
  PrintVector(v1);
  v.swap(v1);
  cout<<"交换后:"<<endl;
  PrintVector(v);
  PrintVector(v1);
}
int main()
{
  test01();
  system("pause");
  return 0;
}



运行结果:



例子2:巧用swap()


#include <iostream>
using namespace std;
#include <string>
#include <vector>
void PrintVector(vector<int>&v)  //打印vector中的数据
{
  for(vector<int>::iterator it = v.begin();it!= v.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<<endl;
}
void test01()
{
  vector<int> v;
  //存放十万个数据进容器
  for(int i=0;i<100000;i++)
  {
  v.push_back(i);
  }
  //看一下容器的容量
  cout<<v.capacity()<<endl;
  //容器的大小
  cout<<v.size()<<endl;
  //重新分配空间
  v.resize(5);
  cout<<endl<<"重新分配空间后:"<<endl;
  cout<<v.capacity()<<endl;    //此时发现容量还是有那么多,这样的话就会浪费掉
  cout<<v.size()<<endl;
  vector<int>(v).swap(v);   //vector<int>(v) 是一个匿名函数,互相交换过后,会自动释放
  cout<<endl<<"收缩后的容器:"<<endl;
  //看一下容器的容量
  cout<<v.capacity()<<endl;
  //容器的大小
  cout<<v.size()<<endl;
}
int main()
{
  test01();
  system("pause");
  return 0;
}



运行结果:



———————————————————————————————————


7.vector 预留空间


.reserve(int len); //容器预留len个元素,预留位置不初始化,元素不可访问


减少vector在动态分配容量时的扩展次数


例:


#include <iostream>
using namespace std;
#include <vector>
void test01()
{
  vector<int> v;
  int *p = NULL;
  int num =0;
  for(int i=0;i<100000;i++)
  {
  v.push_back(i);
  if(p != &v[0])   //这段代码是计算容器开辟新空间的次数
  {
    p = &v[0];
    num++;
  }
  }
  cout<<"动态扩展的次数:"<<num<<endl;
}
int main()
{
  test01();
  system("pause");
  return 0;
}



运算结果:动态扩展次数为30


此时我们加一段代码:v.reserve(100000);


#include <iostream>
using namespace std;
#include <vector>
void test01()
{
  vector<int> v;
  int *p = NULL;
  int num =0;
  v.reserve(100000);  //让容器先预留100000个空间
  for(int i=0;i<100000;i++)
  {
  v.push_back(i);
  if(p != &v[0])   //这段代码是计算容器开辟新空间的次数
  {
    p = &v[0];
    num++;
  }
  }
  cout<<"动态扩展的次数:"<<num<<endl;
}
int main()
{
  test01();
  system("pause");
  return 0;
}



此时运算结果为:动态扩展次数:1

相关文章
|
4月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
45 0
|
6月前
|
存储 算法 编译器
8.STL中Vector容器的常见操作(附习题)
8.STL中Vector容器的常见操作(附习题)
|
6月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
6月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
76 5
|
6月前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
47 1
|
5月前
|
存储 安全 C++
|
5月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
6月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
287 0
|
6月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
59 0
|
6月前
|
存储 缓存 C++
Vector容器介绍
Vector容器介绍
下一篇
DataWorks