1.Vector的常见用法详解
需要添加#include < vector>
using namespace std;
vector翻译为向量,可以理解为“长度根据需要而自动改变的数组”。
(1)定义
vector< typename> name;
注意:vector< vector< int> > name;//>>之间要加空格
(2)访问
①通过下标访问
name[0],name[1]…
②通过迭代器访问
迭代器(iterator)可以理解为一种类似指针的东西,其定义:vector< typename>::iterator it;
eg:
vector< int> vi;
vector< int>::iterator it = vi.begin();
end()函数是取尾元素的下一个地址。
迭代器的两种自加操作:++i;i++;
只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法
(3)vector常用函数
①push_back(x)
在vector后面添加一个元素x。
②pop_back()
删除vector的尾元素。
③size()
获得vector中元素的个数。
④clear()
用来清空vector中的所有元素。
⑤insert()
insert(it,x)用来向vector的任意迭代器it处插入一个元素x,it处原来元素依次后移。
⑥erase()
删除单个元素、删除一个区间内的所有元素。
eg:
erase(it)删除It处的元素。
erase(first,last)删除[first,last)区间内的所有元素。last为所删除区间末尾的下一位。
2.set的常见用法详解
翻译为集合,是一个内部自动有序且不含重复元素的容器。
使用需要添加:
#include < set>
using namespace std;
(1)定义
set< typename> name;
(2)访问
set只能用过迭代器来访问
set< typename>::iterator it;
使用*it来访问set里的元素。
for(set< int >::iterator it = st.begin();it != st.end(); it++)//不支持it< st.end()的写法
{}
(3)常见的函数
①insert()
insert(x)将x插入set容器中,并自动递增排序和去重。
②find()
find(value)返回set中对应值为value的迭代器。
③erase()
④size()
⑤clear()
3.string的常见用法详解
处理字符串
需要添加:
#include< string>
using namespace std;
(1)定义
string str;
(2)访问
①str[n] 通过下标来访问。
要读入和输出整个字符串,只能用cin,cout,若要用printf,则用c_str()来对string进行类型转换
eg:printf("%s\n",str.c_str());
②通过迭代器访问
string::iterator it;
(3)string常用函数
①**+=**
拼接两个string
②大小比较算术符
比较字典序
③length()和size()都是返回string的长度
④insert()
insert(pos,string) 在pos位置插入字符串string
insert(it,it2,it3) it为原字符串欲插入的位置,it2和it3为待插入字符串的首尾迭代器。
⑤erase()
与之前相同的两种用法还有一个新用法
str.erase(pos,length) 以pos为开始位置,删除length个字符
⑥clear()
清空string中的数据
⑦substr()
substr(pos,len)返回从pos号位开始,长度为len的子串。
⑧string::npos
常数,其本身的值为-1,但由于是unsigned_int类型,其值也等于unsigned_int类型的最大值(4294967295)。
⑨find()
str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置。如果str2不是str的子串,那么返回string::npos。
str.find(str2,pos),从str的pos位开始匹配str2。
⑩replace()
str.replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2。
tr.replace(it,it2.str2),把str的迭代器[it,it2)范围的子串替换成str2。
4.map的常用用法详解
map翻译为映射,map可以将任何的基本类型映射到任何基本类型。
需要添加:
#include < map>
using namespace std;
(1)map的定义
map< typename1,typename2> mp;
如果是字符串到整形的映射,必须使用string而不能使用char数组。
(2)map容器内元素的访问
①通过下标访问
eg:map< char,int> mp; 使用mp[‘c’]来访问他对应的值。
②通过迭代器访问
it->first来访问键,it->second来访问值。
map会以键从大到小自动排序。因为map的内部是使用红黑树实现(set也是)。
(3)map常用函数
①find()
find(key)返回键为key的映射的迭代器。
②erase()
删除单个元素,删除一个区间内的所有元素
③size()
返回map中映射的对数
④clear()
清空map中的所有元素
map的键和值是唯一的,如果一个键要对应多个值。就只能用multimap。不排序用unordered_map,以散列代替红黑树实现,速度比map快。
5.queue的常见用法详解
queue翻译为队列,先进先出的容器,
需添加:
#include < queue>
using namespace std;
(1)queue的定义
queue< typename> name;
(2)queue容器内元素的访问
由于队列是先进先出,所以只能通过front()来访问队首元素,通过back()来访问队尾元素。
(3)queue常用函数
①push(x),将x进行入队。
②front(),back(),访问队首元素,队尾元素。
③pop(),令队首元素出队。
④empty(),检测queue是否为空。返回true则空,false则非空。
⑤size(),返回queue中元素的个数
使用front()和pop()函数前,必须使用empty()判断队列是否为空,否则可能因为队列为空出现错误。
deque双端队列,首尾皆可插入和删除的队列。priority_queue优先队列,使用堆实现的默认将当前队列最大元素置于队首的容器。
6.priority_queue的常见用法详解
优先队列,队首元素一定是当前队列中优先级最高的那一个。
需要添加:
#include< queue>
using namespace std;
(1)priority_queue的定义
priority_queue < typename> name;
(2)priority_queue容器内元素的访问
只能通过top()来访问队首元素。
(3)priority_queue常用函数
①push(x),令x入队。
②pop(),令队首元素出队。
③empty(),检测优先队列是否为空。
④size(),返回优先队列内元素的个数。
(4)基础类型的优先级设置
一般是数字大的或者字典序大的优先级越高。
以下的两种定义相同:
priority_queue< int> q;
priority_queue< int,vector < int>,less < int> > q;
想让优先队列把最小的元素放在队首,只需进行如下定义:
priority_queue< int, vector < int>,greater< int> > q;
(5)结构体的优先级设置
struct fruit{
int price;
string name;
};
希望按水果的价格高为优先级高,需要重载小于号“<”。
struct fruit{
int price;
string name;
friend bool operator < (fruit f1,fruit f2){
return f1.price < f2.price;
}
}
};
重载大于号会编译错误
令一种写法:
struct cmp{
bool operator () (fruit f1,fruit f2){
return f1.price<f2.price;
}
};
priority_queue<fruit,vector< fruit>,cmp> q;
如果结构体内的数据较为庞大,建议使用引用来提高效率
bool operator () (const fruit &f1,const fruit &f2){
return f1.price<f2.price;
}
7.stack的常见用法详解
stack翻译为栈,是一种后进先出的容器。
需添加:
#include < stack>
using namespace std;
(1)stack的定义
stack< typename> name;
(2)stack内元素的访问
只能通过top()来访问栈顶元素。
(3)stack的常用函数
①push(x),令x入栈。
②pop(),弹出栈顶元素。
③empty(),检测stack是否为空。
④size(),返回stack内元素的个数。
8.pair的常见用法详解
pair可以看做内部有两个元素的结构体。
需添加:
#include < utility>
using namespace std;
map的头文件中包含了pair。
(1)pair的定义
pair有两个参数,分别对应first和second的数据类型。
pair< typeName1,typeName2> name;
eg:
pair<string,int> p;
pair<string,int> p(“aaa”,1);
临时构建:
pair<string,int>(“aaa”,1)
make_pair<“aaa”,1)
(2)pair的访问
结构体的访问方式,first,second来访问。
(3)pair的常见函数
①比较规则,先以frist的大小作为标准,只有frist相等才去判别second的大小。
9.algorithm头文件下的常用函数
(1)swap(x,y),用来交换x和y的值。
(2)reverse(it,it2),可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转。
(3)next_permutation(),给出一个序列在全排列中的下一个序列。当到达全排列的最后一个时会返回false。
(4)fill(),可以把数组或容器中的某一段取件赋予某个相同的值。和memset不同,fill的赋值可以是数组类型对应范围中的任意值。
(5)sort(),在排序那篇已介绍。
(6)lower_bound(frist,last,val),寻找数组或容器的[frist,last)范围内第一个值大于等于val的元素的位置,返回指针或迭代器。
upper_bound(frist,last,val),寻找数组或容器的[frist,last)范围内第一个值大于val的元素的位置,返回指针或迭代器。