c++Primer第九章:顺序容器

顺序容器

介绍

项目介绍
vector可变数组(建议)(auto)
deque队列 (操作略)
list双向链表(建议)(auto)
forward_list单向链表
array固定数组
string可变

一般操作

类别名
iterator
const_iterator
size_type
different_type : 两个迭代器之间的距离
value_type : 元素类型
reverse_iterator: 按照逆序的迭代器

初始化

一般容器

项目Value
C c
C c1(c2)
C c1=c2
C c{a,b,c,d…}
C c={a,b,c,d…}
C c(b,e)迭代器指定的范围 [begin,end)
C seq(n)包含了n个元素,并进行了初始化,string不可用
C seq(n,t)包含 了n个初始化为t的元素

array

必须指定类型和大小,类型和数量一致可以直接赋值

array<int,10>
array<int,10>::size_type i;

赋值和swap

assgin:替换

项目Value
seq.assign(b,e)[begin,end)
seq.assign(il)全替换为il
seq.assign(n,t)替换为n个值为t的元素,原来有n-1个元素也无事

不适合关联容器(按照键值进行保存和访问)以及array。

swap:交换

项目Value
swap(a,b)
a.swap(b)

关系运算符

1.数量相等比数值。
2.数量不等比数值,之后再比数量。

添加元素

	list<int> a{1,2,3,4,5,6,7};
	auto t=a.insert(a.begin(),3,9);
	cout<<*t<<endl;
	cout<<*(++t)<<endl;
	return 0;	

结果,返回的是最新一个添加的元素位置,即最左边的
在这里插入图片描述

vector和string

项目Value
c.push_back(t)t必须和c类型一致
c.emplace_back(arg)会调用构造函数,class C c.emplace_back(“hello”),会自动调用class c相应的构造函数
c.insert(p,t)指定p位置之前插入t,返回的是第一个新加入元素的迭代器
c.emplace(p,args)
c.insert(p,n,t)p之前n个t
c.insert(p,b,e)
c.insert(p,il)il是花括号包围得到元素值序列
c.front()首元素
c.back()尾元素

list

项目Value
c.push_back(t)t必须和c类型一致
c.emplace_back(arg)会调用构造函数,class C c.emplace_back(“hello”),会自动调用class c相应的构造函数
c.push_front(t)将元素插到头部 (头插法)
c.emplace_front(arg)
c.insert(p,t)指定p位置之前插入t,返回的是第一个新加入元素的迭代器
c.emplace(p,args)
c.insert(p,n,t)p之前n个t
c.insert(p,b,e)
c.insert(p,il)il是花括号包围得到元素值序列
c.front()首元素
c.back()尾元素

forward_list

项目Value
a.before_begin()
a.cbefore_begin()
a.insert_after(p,t)返回指向最后一个插入元素的迭代器,下同
a.insert_after(p,n,t)在p之后插入n个t
a.insert_after(p,b,e)范围为空,返回p,下同
a.insert_after(p,il)il是花括号包围得到元素值序列,
emplace_after(p,args)
a.erase_after§删除p之后元素
a.erase_after(b,e)删除范围(b,e),不包括b不包括e
c.front()首元素

访问

项目Value
c.begin() , c.end();$都能使用迭代器
c.at()string,vector,deque,array访问失败抛出out_of_range异常
auto &c=a.begin()引用修改

删除

vector和string

项目Value
c.pop_back()最后一个
c.erase§返回被删除元素之后的元素迭代器
c.erase(b,e)删除[begin,end)
c.clear()

list

项目Value
c.pop_back()
c.pop_front()
c.erase§
c.clear()

非单向链表删除代码

for(vector<int>::iterator iter = ivec.begin();iter != ivec.end();){
	if((*iter) %2 == 0)
		iter = ivec.erase(iter);
	else  
		iter++;
}

单向链表删除代码

其实还是要保存前一位的位置

	forward_list<int> list_1={1,2,3,4,5,6,7,8,9};
	auto bb=list_1.before_begin();
	auto b=list_1.begin();
	while(b!=list_1.end()){
		if(*b%2){
			cout<<"delet "<<*b<<endl;
			b=list_1.erase_after(bb);
		}
		else {
			bb=b;
			++b;
		}
	}
	cout<<"after:"<<endl;
	for(auto it: list_1)
		cout<<it<<endl;

结果
在这里插入图片描述

改变容器大小

如果当前容器大小大于resize大小,容器后面的数据会被删除,注意迭代器失效

项目Value
list< int > list(10,42)10个42
list.resize(15)追加5个0
list.resize(25,-1)追加10个-1
ist.resize(5)删除后20个

代码

删除偶数复制奇数

在确定的位置之前插入

	vector<int> l={1,2,3,4,5,6,7,8,9};
	auto it = l.begin();
	while (it!=l.end())
	{
		if(*it%2){
			it = l.insert(it,*it);
			it = it+2; //注意此处,insert在it之前插入,并且要跳过当前处理的值
		}
		else it=l.erase(it);
	}
	cout<<"after:"<<endl;
	for(auto it: l)
		cout<<it<<endl;

结果
在这里插入图片描述

在确定的位置之后插入

在每一个值之后插入42
	vector<int> l={1,2,3,4,5,6,7,8,9};
	auto it = l.begin();
	while (it!=l.end())
	{
		++it;
		it = l.insert(it,42);
		++it;
	}
	cout<<"after:"<<endl;
	for(auto it: l)
		cout<<it<<endl;

结果
在这里插入图片描述

管理容量

都不一定能退回内存空间

项目Value
c.shringk_to_fitvector string deque 将capacityj减少至==size()
c.capacity()vector string 不重新分配内存时的最大容量
c.reserve(n)vector string 分配至少容纳n个元素的内存空间

string的额外操作

string的添加删除修改

超出范围会扔out_of_range

项目Value
string s(cp,n)cp前n个
string s(s2,pos2)从s2下标pos2开始拷贝
string s(s2,pos2,len2)从s2下标pos2开始拷贝长为len2
s.substr(pos,n)返回一个string 从s的pos开始n个字符拷贝
s.inster(s.size(),5,’!’)末尾插入5个!
s.erase(s.size()-5,5)删除后5个
s.insert(pos,n,c)在下标 pos 的元素之前插入 n 个字符 c
s.insert(pos,s2)在下标 pos 的元素之前插入 string 对象 s2
s.insert(pos,s2,pos2,len)在下标为 pos 的元素之前插入 s2 中从下标 pos2 开始的 len 个字符
s.insert(pos,cp,len)/在下标为 pos 打元素之前插入 cp 所指向数组的前len 个字符
s.insert(pos,cp)在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本
s.assign(s2)用 s2 的副本替换 s
s.assign(s2,pos2,len)用 s2 中从下标 pos2 开始的 len 个字符替换 s
s.assign(cp,len)用 cp 所指向数组的前 len 个字符副本替换 s
s.assign(cp)用 cp 所指向的以空字符结束的字符串替换 s
s.erase(pos,len)删除从下标 pos 开始的 len 个字符

string的查找

项目Value
s.find( args)在 s 中查找 args 的第一次出现
s.rfind( args)在 s 中查找 args 的最后一次出现
s.find_first_of( args)在 s 中查找 args 的任意字符的第一次出现
s.find_last_of( args)在 s 中查找 args 的任意字符的最后一次出现
s.find_first_not_of( args)在 s 中查找第一个不属于 args 的字符
s.find_last_not_of( args)在 s 中查找最后一个不属于 args 的字符

例如

string numbers("0123456789"),name("r2d2");
name.find_first_of(numbers)

输出为1,即name中第一个出现在numbers中的字符位置

字符串匹配

指定搜索位置,从pos开始

string::size_type pos=0;
while(pos=name.find_first_of(number,pos)!=string::npos){
	cout<<"find string "<<pos<<end;
	++pos;
}

string转数值

项目Value
to_string(val)把val转换成string
stoi(s,p,b)把字符串s从p开始转换成b进制的int
stol(s,p,b)把字符串s从p开始转换成b进制的long
stoul(s,p,b)把字符串s从p开始转换成b进制的unsigned long
stoll(s,p,b)把字符串s从p开始转换成b进制的long long
stoull(s,p,b)把字符串s从p开始转换成b进制的unsigned long long
stof(s,p)把字符串s从p开始转换成float
stod(s,p)把字符串s从p开始转换成double
stold(s,p)把字符串s从p开始转换成long double

把混合字符串转数字

	string ss = "pi = 3.14";
	auto d = stod(ss.substr(ss.find_first_of("+-.0123456789")));
	cout<<d<<endl;

结果
在这里插入图片描述

数字转字符串

double a = 123.32;
string res;
stringstream ss;
ss << a;
ss >> res;//或者 res = ss.str();

stack queue略

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值