【C++】STL库Vector容器

本文详细介绍了C++ STL库中的Vector容器,包括其构造函数、push_back与insert元素、erase与pop_back删除操作,clear与size/capacity/max_size函数,以及遍历、迭代器、swap与assign方法。通过实例演示,展示了如何高效地使用和管理动态数组向量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。
可以简单的认为,向量是一个能够存放任意类型的动态数组。

1. 构造函数

  1. vector() // 创建一个空vector
  2. vector(int nSize) // 创建一个vector,元素个数为nSize(值默值:int类型0,char类型’ (空)‘)
  3. vector(int nSize,const T& t) // 创建一个vector,元素个数为nSize,且值均为t
  4. vector(const vector&) // 拷贝构造函数
  5. vector(begin,end) // 复制[begin,end)区间内另一个数组的元素到vector中
int main() {
	//------------------  vector() :创建一个空vector
	vector <char>v2;
	cout << v2.empty() << endl; // 1(空)


	//------------------  vector(int nSize): 创建一个vector, 元素个数为nSize
	vector<int> v3(5);
	cout << v3.size() << endl; // 5
	for (int i = 0; i < v3.size(); ++i) {
		cout << v3[i] << " "; // 0 0 0 0 0
	}
	vector<char> v3a(5);
	cout << v3a.size() << endl; // 5
	for (int i = 0; i < v3a.size(); ++i) {
		cout <<"v3a:" << v3a[i] << " "; // v3a:  v3a:  v3a:  v3a:  v3a: (空)
	}

	//------------------  vector(int nSize, const T& t):创建一个vector,元素个数为nSize, 且值均为t
	vector<int> v1(5, 2);
	for (int i = 0; i < v1.size(); ++i) {
		cout << v1[i] << " "; // 2 2 2 2 2
	}


	//------------------  vector(const vector&):拷贝构造函数
	vector<int> v4a(3, 2); // 3个2
	vector<int> v4b(2, 9);  // 2个'9'

	v4b = v4a; // 注意:赋值要求复制对象和被复制对象类型一致,否则编译报错
	for (int i = 0; i < v4b.size(); ++i) {
		cout <<"v4b:"<< v4b[i] << " "; //  v4b:2 v4b:2 v4b:2
	}

	for (int i = 0; i < v4a.size(); ++i) {
		cout << "v4a:" << v4a[i] << " "; //  v4a:2 v4a:2 v4a:2
	}	

	return 0;
}

2. 增加

2.1 push_back()

void push_back(const T& x); // 向量尾部增加一个元素X

2.2 insert()

  1. iterator insert(iterator it,const T& x)://向量中迭代器指向元素前增加一个元素x
  2. iterator insert(iterator it,int n,const T& x)://向量中迭代器指向元素前增加n个相同的元素x
  3. iterator insert(iterator it,const_iterator first,const_iterator last)://向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
int main() {
	//------------------ push_back() 函数:尾部插入元素
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	for (int i = 0; i < v1.size(); ++i) {
		cout << v1[i] << "  ";
	}


	//------------------ insert(iterator it,const T& x) :不去重,只是单纯的在尾部插入元素 
	vector<char> v2;
	v2.insert(v2.begin(),'0'); // 向量中迭代器指向元素前增加一个元素'0'
	v2.insert(v2.begin()+1, '1');
	v2.insert(v2.begin()+2, '2');
	v2.insert(v2.begin() + 3, '1');
	v2.insert(v2.begin() + 4, '3');
	for (int i = 0; i < v2.size(); ++i) {
		cout << "v2:"<< v2[i] << "  "; //  v2:0  v2:1  v2:2  v2:1  v2:3
	}


	//------------------ insert(iterator it,int n,const T& x):  向量中迭代器指向元素前增加n个相同的元素x
	vector<int> v3;
	v3.insert(v3.begin(), 2,3);
	for (int i = 0; i < v3.size(); ++i) {
		cout << "v3:" << v3[i] << "  "; //  v3:3  v3:3
	}


	//------------------ insert(iterator it,const_iterator first,const_iterator last)://向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
	vector<int> v4a;
	vector<int> v4b;
	v4b.push_back(1);
	v4b.push_back(2);
	v4b.push_back(3);

	v4a.push_back(66);
	v4a.push_back(55);
	v4a.push_back(44);

	v4a.insert(v4a.begin(),v4b.begin(), v4b.end());
	for (int i = 0; i < v4a.size(); ++i) {
		cout << "v4a:" << v4a[i] << "  "; //   v4a:1  v4a:2  v4a:3  v4a:66  v4a:55  v4a:44
	}
	return 0}

3. 删除

3.1 erase()

  1. iterator erase(iterator it): //删除向量中迭代器指向元素,返回删除元素的下一个元素的迭代器
  2. iterator erase(iterator first,iterator last): //删除向量中[first,last)中元素

3.2 pop_back()

void pop_back(): //删除向量中最后一个元素

3.3 clear()

void clear(): //清空向量中所有元素

3.4 代码演示

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

int main() {
	//------------------ erase(iterator it);   //删除向量中迭代器指向元素
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	vector<int>::iterator it;
	it=v1.erase(v1.begin()); // 返回删除元素的下一个元素的迭代器
	cout <<"the next is : "<< *it << endl; // the next is : 2
	
	for (int i = 0; i < v1.size(); ++i) {
		cout << v1[i] << "\t"; // 2       3
	}


	//------------------ erase(iterator it);   //删除向量中迭代器指向元素
	vector<int> v2;
	v2.push_back(1);
	v2.push_back(2);
	v2.push_back(3);
	v2.push_back(4);
	v2.push_back(5);

	vector<int>::iterator fist = v2.begin()+2;
	vector<int>::iterator last = v2.end();

	v2.erase(fist, last);
	for (int i = 0; i < v2.size(); ++i) {
		cout << v2[i] << "\t"; //  1       2     
	}


	//------------------ pop_back()  //删除向量中最后一个元素
	vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	v3.push_back(4);
	v3.push_back(5);

	v3.pop_back();
	for (int i = 0; i < v3.size(); ++i) {
		cout << v3[i] << "\t"; //   1       2       3       4  
	}


	//------------------ clear():  //清空向量中所有元素
	vector<int> v5;
	v5.push_back(1);
	v5.push_back(2);
	v5.push_back(3);
	v5.push_back(4);

	v5.clear();
	for (int i = 0; i < v5.size(); ++i) {
		cout << v5[i] << "\t"; // (空) 
	}

	return 0;
}

4. 查——遍历函数

4.1 at( )

reference at(int pos); // 返回pos位置元素的引用

4.2 front()

reference front(); // 返回首元素的引用

4.3 back()

reference back(); //返回尾元素的引用

4.4 date()

date() 返回的是首元素的地址(裸指针)

4.5 [ ] 下标访问

4.6 迭代器

  1. iterator begin(): //返回向量头迭代器指针,指向第一个元素
  2. iterator end(): //返回向量尾迭代器指针,指向向量最后一个元素的下一个位置
  3. reverse_iterator rbegin():反向迭代器,指向最后一个元素
  4. reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

4.7 代码演示

int main() {
	//------------------ iterator begin(); //返回向量头迭代器指针,指向第一个元素
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(2);
	v1.push_back(6);

	cout << v1[4] << endl;//6
	cout << v1.at(4) << endl;//6
	cout << v1.front() << endl;//1
	cout << v1.back() << endl;//6
	cout << v1.data() << endl;//006104D0 返回首元素的地址


	//------------------ iterator begin(); //返回向量头迭代器指针,指向第一个元素
	// 法1
	cout << *(v1.begin()) << endl; // 1
	// 法2
	vector<int>::iterator it = v1.begin(); 
	cout << *it << endl; // 1
	
	
	//------------------ everse_iterator rbegin():反向迭代器,指向最后一个元素
	cout << *(v1.rbegin()) << endl; // 6

	return 0;
}

5. 改

swap()交换

void swap(vector&): // 交换两个同类型向量的数据(长度可以不同)

注意:内容全部交换,元素个数不同也会交换

assign()设置值

  1. void assign(int n,const T& x); //把当前向量替换为n个x
  2. void assign(const_iterator first,const_iterator last); //把当前向量v4的所有元素替换为向量v5中[first,last)区间内的所有元素(当前向量的长度改变)

代码演示

int main() {
	//------------------ swap(vector&);     //交换两个同类型向量的数据
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	vector<int> v2;
	v2.push_back(9);
	v2.push_back(9);
	v2.push_back(9);
	v2.push_back(10);
	v2.push_back(11);

	v1.swap(v2);
	for (int i = 0; i < v1.size(); ++i) {
		cout << "v1="<< v1[i] << " "; // v1=9 v1=9 v1=9 v1=10 v1=11
	}
	for (int i = 0; i < v2.size(); ++i) {
		cout << "v2=" << v2[i] << " "; // v2=1 v2=2 v2=3
	}


	//------------------ assign(int n,const T& x);   //把当前向量替换为n个x
	vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	v3.push_back(6);
	v3.push_back(6);
	v3.push_back(6);

	cout << v3.size() << endl; // 6
	v3.assign(3, 10);
	cout << v3.size() << endl; // 3

	for (int i = 0; i < v3.size(); ++i) {
		cout << "v3[" <<i<<"]="<< v3[i] << " "; // v3[0]=10 v3[1]=10 v3[2]=10
	}


	//------------------ assign(const_iterator first, const_iterator last):    //把当前向量v4的所有元素替换为向量v5中[first,last)区间内的所有元素(当前向量,长度改变)。
	vector<int> v4;
	v4.push_back(1);
	v4.push_back(2);
	v4.push_back(3);
	v4.push_back(6);
	v4.push_back(6);
	v4.push_back(6);

	vector<int> v5;
	v5.push_back(8);
	v5.push_back(8);
	v5.push_back(8);

	v4.assign(v5.begin() + 1, v5.end());
	for (int i = 0; i < v4.size(); ++i) {
		cout << "v4[" << i << "]=" << v4[i] << " "; // v4[0]=8 v4[1]=8
	}
	for (int i = 0; i < v5.size(); ++i) {
		cout << "v5[" << i << "]=" << v5[i] << " "; // v5[0]=8 v5[1]=8 v5[2]=8 不变
	}


	return 0;
}

6. 判空 empty()

bool empty() const:判断向量是否为空,若为空,则向量中无元素

7. 大小函数

size()

int size() const:返回向量中元素的个数

capacity()

int capacity() const:返回当前向量所能容纳的最大元素值

max_size()

int max_size() const:返回最大可允许的vector元素数量值

代码演示

	vector<int>v(5);
	vector<int>v1;
	cout << v.size() << endl; //5
 	cout << v.capacity() << endl; //5
 	cout << v1.empty() << endl; //1
	cout << v.empty() << endl; //0

	v1.push_back(2);
	v1.push_back(3);
	cout << v1.size() << endl; //2
	cout << v1.capacity() << endl; //2
	cout << v1.capacity() << endl; //2
	cout << v1.empty() << endl; //0
	

	//------------------ max_size() 
	vector<int>v1a;
	v1a.push_back(2);
	v1a.push_back(3);
	cout << v1a.max_size() << endl; // 1073741823

	v1a.push_back(2);
	v1a.push_back(3);
	cout << v1a.max_size() << endl; // 1073741823

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值