(STL及算法)7.顺序容器的操作

本文深入探讨了C++中顺序容器vector、list和deque的详细操作,包括元素的添加、访问、删除,容器的大小调整,元素的比较,以及赋值和交换等核心功能。通过实例演示了各种操作的正确使用方法。

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

一、顺序容器操作1

1.容器的定义和类型别名
2.begin和end成员(这两个成员返回的都是迭代器类型)
顺序容器三种:
vector
list
deque
这三种顺序容器的操作方式是一致的。

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

int main()
{
	vector<int>        a;
	const vector<int> ca; //const容器不能被修改和添加数据

	list<int>          b;
	deque<int>         c;

	a.push_back(10);
	a.push_back(20);
	a.push_back(30);

	b.push_back(100);
	b.push_back(200);
	b.push_back(300);

	c.push_back(1);
	c.push_back(2);
	c.push_back(3);

	for (vector<int>::size_type i = 0; i < a.size(); ++i)
		cout << a[i] << endl;

	//报错,list链表中没有下标
	/*for (list<int>::size_type j = 0; j < b.size(); ++j)
		cout << b[j] << endl;*/

	for (deque<int>::size_type k = 0; k < c.size(); ++k)
		cout << c[k] << endl;
	
	//begin指向容器中的第一个元素
	vector<int>::iterator firsta = a.begin();
	//end指向容器中的最后一个元素的下一个
	vector<int>::iterator lasta = a.end();

	cout << "迭代器" << *firsta << endl;
	//cout << *lasta << endl;  //错误

	while (firsta!=lasta)
	{
		cout << "迭代器循环:" << *firsta << endl;
		++firsta;
	}

	//list和deque也是一样的
	vector<int>::reverse_iterator rfirsta = a.rbegin(); //rbegin返回一个逆序迭代器(从最后一个向前进行迭代)
	vector<int>::reverse_iterator rlasta = a.rend();

	//常迭代器
	vector<int>::const_iterator cfirsta = ca.begin();
	vector<int>::const_iterator clasta = ca.end();

	vector<int>::size_type                   a1;
	vector<int>::iterator                    a2;
	vector<int>::const_iterator              a3;//常迭代器,不可以改变
	vector<int>::reverse_iterator            a4;
	vector<int>::const_reverse_iterator      a5;
	vector<int>::difference_type             a6;

	list<int>::size_type                     b1;
	list<int>::iterator                      b2;
	list<int>::const_iterator                b3;
	list<int>::reverse_iterator              b4;
	list<int>::const_reverse_iterator        b5;
	list<int>::difference_type               b6;

	deque<int>::size_type                    c1;
	deque<int>::iterator                     c2;
	deque<int>::const_iterator               c3;
	deque<int>::reverse_iterator             c4;
	deque<int>::const_reverse_iterator       c5;
	deque<int>::difference_type              c6;

    return 0;
}

二、顺序容器操作2

1.在顺序容器中添加元素

c.push_back(t)
c.push_front(t)
c.insert(p,t) 插入在迭代器的前面
c.insert(p,n,t) 插入在迭代器的前面n个t
c.insert(p,b,e) 把b和e两个迭代器之间的元素插入到,p迭代器的前面

2.容器添加的元素都是副本
3.添加元素可能会使迭代器失效
4.避免存储end操作返回的迭代器

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>

using namespace std;

int main()
{
	vector<string> svec;
	list<string> slist;
	deque<string> sdeq;

	svec.push_back("Bill"); //Vector容器只可以单向插入数据

	slist.push_back("Bill");
	slist.push_front("aaa");

	sdeq.push_back("bbb");
	sdeq.push_front("ccc");

	for (list<string>::iterator iter = slist.begin();
		iter != slist.end(); ++iter)
		cout << *iter << " ";
	cout << endl;

	list<string>::iterator it = slist.begin();
	cout << *it << endl;

	++it;
	cout << *it << endl;
	//在list链表中插入10个  “hhh”字符串
	slist.insert(it, 10,"hhh");
	for (list<string>::iterator iter = slist.begin();
		iter != slist.end(); ++iter)
		cout << *iter << " ";
	cout << endl;

	//创建一个数组,插入数组中的字符串
	string arr[4] = { "ggg","kkk","jjj" };
	slist.insert(it, arr + 1, arr + 2);
	for (list<string>::iterator iter = slist.begin();
		iter != slist.end(); ++iter)
		cout << *iter << " ";
	cout << endl;

	return 0;

}

三、顺序容器操作3

1.关系运算符
2.所有的容器类型都可以使用
3.比较的容器必须具有相同的类型
4.容器的比较是基于容器内元素的比较
5.容器内元素必须有相应的关系运算符

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

int main()
{
	vector<int> ivec1;//容器的比较必须是同类型的,比如int和double类型的就不能进行比较;list和vector类型的也不可以比较
	vector<int> ivec2;

	ivec1.push_back(1);
	ivec1.push_back(3);
	ivec1.push_back(5);
	ivec1.push_back(7);
	ivec1.push_back(9);
	
	ivec2.push_back(2);
	ivec2.push_back(4);
	ivec2.push_back(6);
	ivec2.push_back(8);
	ivec2.push_back(10);

	if (ivec1 > ivec2)    //如果容器中的元素数量相同的话,比较每一个元素的大小; 如果容器中的元素数量不同,比较元素的长度。
		cout << "ivec2小" << endl;
	else if (ivec1 < ivec2)
		cout << "ivec1小" << endl;
	else
		cout << "两个向量相等" << endl;

}

四、顺序容器操作4

1.容器的大小操作

c.size()
c.max_size()
c.empty()
c.resize(n)
c.resize(n,t)

注意:resize操作可能会使迭代器失效

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

int main()
{
	//vector和deque容器也是同样的操作
	list<int> ilist;
	ilist.push_back(10);
	ilist.push_back(20);
	ilist.push_back(30);

	cout << "容器里数据的个数:" << ilist.size() << endl;

	list<int>::size_type count = ilist.size();
	cout << "容器里数据的个数:" << count << endl;

	cout << "容器中最多可以保存数据的个数:" << ilist.max_size() << endl;

	if (ilist.empty())
		cout << "容器是空的!" << endl;
	else
		cout << "容器不是空的!" << endl;

	ilist.resize(10); //没有数据的话 默认为0
	

	ilist.resize(20, 1);//新增加的数据都为1
	for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
		cout << *iter << endl;

	cout << endl << endl;

	ilist.resize(2);//缩小容器的大小
	for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
		cout << *iter << endl;


	return 0;
}

五、顺序容器操作5

1.访问元素
c.back()
c.front()
c[n]
c.at(n)
注意:c[n]和c.at[n]只适合vector和deque容器,list是链表没有下标,所以list不能使用。

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

int main()
{
	vector<int> ivec;
	ivec.push_back(10);
	ivec.push_back(20);
	ivec.push_back(30);

	cout << ivec.front() << endl;
	cout << ivec.back() << endl;

	cout << endl << endl;


	vector<int>::reference a = ivec.front(); // ivec.front()返回一个引用类型
	vector<int>::reference b = ivec.back();
	cout << a << endl;
	cout << b << endl;


	cout << *ivec.begin() << endl;//利用迭代器输出ivec.front同样的元素

	//ivec[]操作如果下标越界,不会抛出异常
	cout << ivec[0] << endl;
	cout << ivec[1] << endl;
	cout << ivec[2] << endl;

	//ivec.at()操作如果下标越界  就会抛出异常
	cout << ivec.at(0) << endl;
	cout << ivec.at(1) << endl;
	cout << ivec.at(2) << endl;

	return 0;
}

六、顺序容器的操作6

1.删除元素

c.erase(p)  //利用迭代器,删除迭代器所指向的元素
c.erase(b,e)  //两个迭代器的之间的元素,但是包括前方的不包括后方的
c.clear()  //全部删除
c.pop_back()  //最后一个删除
c.pop_front() //前面第一个删除

注意:c.pop_front()只适用于list和deque容器

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
	list<string> slist;
	slist.push_back("aaa");
	slist.push_back("bbb");
	slist.push_back("ccc");
	slist.push_back("ddd");
	slist.push_back("eee"); 
	slist.push_back("fff");

	slist.pop_front();//删除链表中第一个和最后一个
	slist.pop_back();

	string s1("ccc");
	string s2("eee");


	list<string>::iterator iter1 = find(slist.begin(), slist.end(), s1);
	list<string>::iterator iter2 = find(slist.begin(), slist.end(), s2);

	if (iter1 != slist.end() && iter2 != slist.end())
		slist.erase(iter1, iter2); //删除从iter1到iter2迭代器指向的数据,包括iter1但不包括iter2

	else
		cout << "没找到!" << endl;

	//删除链表中的所有元素 
	slist.clear();
	slist.erase(slist.begin(), slist.end());

	for (list<string>::iterator iter = slist.begin();
		iter != slist.end(); ++iter)
		cout << *iter << endl;

	return 0;


}

七、顺序容器的操作7

1.赋值与交换(swap)

c1=c2
c1.swap(c2)
c.assign(b,e)
c.assign(n,t)

2.使用assign:类型兼容即可
3.使用swap:类型必须相同

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

int main()
{
	vector<int> a;
	vector<int> b;
	vector<int> c;

	a.push_back(10);
	a.push_back(20);
	a.push_back(30);
	a.push_back(40);

	b.push_back(100);
	b.push_back(200);
	b.push_back(300);

	c.push_back(1);
	c.push_back(2);
	c.push_back(3);
	c.push_back(4);
	c.push_back(5);
	c.push_back(6);

	a.swap(b);//a容器与b容器交换

	for (vector<int>::iterator iter = a.begin();
		iter != a.end(); ++iter)
		cout << *iter << endl;

	a = b;//将b赋值给a,允许不同容器中的,相同元素类型赋值

	for(vector<int>::iterator iter=a.begin();
		iter!=a.end();++iter)
		cout << *iter << endl;

	vector<int>::iterator f = c.begin();
	++f;
	++f;
	vector<int>::iterator e = c.end();
	--e;

	a.assign(f, e);

	for (vector<int>::iterator iter = a.begin();
		iter != a.end(); ++iter)
		cout << *iter << endl;

	return 0;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值