C++知识点17——使用C++标准库(顺序容器vector常用操作)

本文深入探讨C++标准模板库中的vector容器,讲解其赋值、交换、元素添加与访问、删除等操作,并提供示例代码,帮助读者掌握vector的高效使用技巧。

        C++STL中的容器类型分为两种,一种是顺序容器,另一种是关联容器,这两种容器之所以被划分,本质区别是顺序容器可以通过元素在容器中的位置进行访问及存储,而关联容器只能通过键来访问和存储元素

        顺序容器常用的主要有以下几个:vector(可变数组),string(字符数组),list(双向链表),deque(双端队列),这几个容器都定义在各自的头文件中,头文件名与容器名相同

1.vector(可变数组)

最最常用的容器,可随机访问,插入和删除元素较list慢

vector概述见C++知识点4——vector与string简述

1.1 vector的赋值

vector的赋值除了使用列表赋值

和别的vector对象赋值,还可以使用assign操作,assign的操作方式有以下三种

template <class InputIterator>
void assign (InputIterator first, InputIterator last);

这种操作接受的是两个输入迭代器,将迭代器范围内的元素赋值给容器

 

void assign (size_type n, const value_type& val);

这种操作接受的是n个val,将n个val赋值给容器

 

void assign (initializer_list<value_type> il);

这种操作接受的是一个初始化列表,将列表中的元素赋值给容器

 

具体使用如下:

int main(int argc, char const *argv[])
{
	vector<int> v1(10,3);
	v1.assign(10,6);
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<"------------------------"<<endl;
	v1.assign({1,2,3,4,5});
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<"------------------------"<<endl;
	vector<int> v2(10,4);
	v1.assign(v2.begin()+3,v2.end());
	for (auto i:v1) {
		cout<<i<<endl;
	}
	
	return 0;
}

上述三种赋值操作将vector内的元素值擦除并替换

 

1.2 交换两个vector

交换两个vector可以使用swap函数

void swapope()
{
	vector<int> v1={1,2,3};
	vector<int> v2={4,5,6};
	for (int i=0;i<v1.size();++i) {
		cout<<v1[i]<<','<<&v1[i]<<endl;
	}
	cout<<"------------------------"<<endl;
	for (int i=0;i<v2.size();++i) {
		cout<<v2[i]<<','<<&v2[i]<<endl;
	}

	swap(v1,v2);
	cout<<"after swap"<<endl;

	for (int i=0;i<v1.size();++i) {
		cout<<v1[i]<<','<<&v1[i]<<endl;
	}
	cout<<"------------------------"<<endl;
	for (int i=0;i<v2.size();++i) {
		cout<<v2[i]<<','<<&v2[i]<<endl;
	}
}

可见,交换前后,两个容器仅仅只是换个名字,容器里的元素没被移动,所以,swap之后,容器的迭代器仍然有效,仍然指向swap之前的那些元素

因为swap仅仅是交换名字,所以对于常用的顺序容器来说,swap不进行任何的拷贝,删除,添加操作,处理时间为常数

 

1.3 添加元素

vector常用的添加元素的方法处理push_back(尾部添加)外,还有insert方法,insert方法的重载有以下四种:

 

1.在迭代器position指向元素之前插入一个值为val的元素,返回指向val的迭代器

iterator insert (const_iterator position, const value_type& val);

 

示例:

void insertope()
{
	vector<int> v1={1,2,3};
	vector<int>::iterator it=v1.insert(v1.begin()+1,66);
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<endl;
}

v1.begin()+1指向第二个元素,所以在第二个元素的前面位置上插入66,返回的迭代器也指向66

 

2.在迭代器position指向元素之前插入n个值为val的元素,返回指向第一个val的迭代器

iterator insert (const_iterator position, size_type n, const value_type& val);

 

示例

void insertope()
{
	vector<int> v1={1,2,3};
	vector<int>::iterator it=v1.insert(v1.begin()+1,5,66);
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<','<<*(--it)<<endl;
}

 

3.在迭代器position指向元素之前插入迭代器first和last范围内的元素,返回指向新添加第一个元素的迭代器

template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);

示例

void insertope()
{
	vector<int> v1={1,2,3};
	vector<int> v2={4,5,6};
	vector<int>::iterator it=v1.insert(v1.begin()+1,v2.begin()+1,v2.end());
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<','<<*(--it)<<endl;
}

 

4.在迭代器position指向元素之前插入列表范围内的元素,返回指向新添加第一个元素的迭代器

iterator insert (const_iterator position, initializer_list<value_type> il);

示例

void insertope()
{
	vector<int> v1={1,2,3};
	vector<int> v2={4,5,6};
	vector<int>::iterator it=v1.insert(v1.begin()+1,{11,22,33});
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<','<<*(--it)<<endl;
}

 

1.4 访问元素

除了使用迭代器和下标进行元素访问,还有三个方法可以访问vector中的元素

 

1 at方法,返回下标为n的引用

reference at (size_type n);
const_reference at (size_type n) const;
void atfunc()
{
	vector<int> v(10);
	for (int i=0;i<v.size();++i) {
		v.at(i)=i;//调用reference at (size_type n);
	}
	for (int i=0;i<v.size();++i) {
		cout<<v.at(i)<<endl;//调用const_reference at (size_type n) const;
	}
}

 

2 back方法,返回尾元素的引用

reference back();
const_reference back() const;

3.front方法,返回头元素的引用

reference front();
const_reference front() const;

 

示例

void backandfrontfunc()
{
	vector<int> v1={1,2,3};
	v1.front()-=v1.back();//1-3
	cout<<v1.front()<<endl;//返回引用,所以v1.front()变为-2

	v1.back()-=v1.front();//3-(-2)
	cout<<v1.back()<<endl;

	for (auto i:v1) {
		cout<<i<<endl;
	}
}

 

上述这些方法访问是要确保vector对象中不为空,且索引n不能越界

 

1.4 删除元素

除了pop_back用来删除尾元素之外(使用pop_back前,一定要判断vector对象不为空),还有clear方法用来删除vector中的所有元素,还有重载方法erase删除vector中的指定元素

 

1 clear函数,清楚所有的vector中的元素

void clear();

 

2.erase函数,删除迭代器指向的元素,返回被删除元素之后元素的迭代器

iterator erase (iterator position);
void erasefunc()
{
	vector<int> v1={1,2,3};
	vector<int>::iterator it=v1.erase(v1.begin()+1);
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<endl;
}

it指向3

 

3.erase函数,删除迭代器范围内的元素,返回最后一个被删除元素之后元素的迭代器

iterator erase (iterator first, iterator last);
void erasefunc()
{
	vector<int> v1={1,2,3,4,5,6};
	vector<int>::iterator it=v1.erase(v1.begin()+2, v1.begin()+4);
	for (auto i:v1) {
		cout<<i<<endl;
	}
	cout<<*it<<endl;
}

删除了3和4,最后it指向5

 

参考

http://www.cplusplus.com/reference/vector/vector/

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值