C++STL应用

vector

  • 访问,下标和迭代器两种方式
  • 注意在STL中,只要vector和string允许vi.begin()+3这种迭代器加上整数的写法
#include<vector>
#include<iostream>
using namespace std;


//访问vector 下标/迭代器
int main() {
	vector<int> vi;
	for (int i = 0; i <= 5; i++) {
		vi.push_back(i);
	}
	//vi.begin()为取vi的首元素地址,而it指向这个地址
	//it迭代器可以看作指针
	//vi[i]和*(vi.begin()+i)等价
	vector<int>::iterator it = vi.begin();
	for (int i = 0; i < 5; i++) {
		printf("%d ", *(it + i));//输出vi[i]
	}
	return 0;
}
  • 常用函数:
push_back()//向vector后添加一个元素 T=O(1)
pop_back()//删除vector尾元素T=O(1)
size()//获取vector中个数T=O(1) unsign int
clear()//清空vector中所有元素T=O(N)
insert()//insert(it,x)用于向vector的任意迭代器it处插入一个元素T=O(N)
//例子:
int main() {
	vector<int> vi;
	for (int i = 1; i <= 5; i++) {
		vi.push_back(i);//此事为1 2 3 4 5
	}
	vi.insert(vi.begin() + 2, 1);//将-1插入vi[2]的位置
	for (int i = 0; i < vi.size(); i++) {
		printf("%d ", vi[i]);
	}
	return 0;
}

set

集合,是一个内部自动有序而且不含重复元素的容器。

  • 访问 只能用迭代器
    例子:
#include<set>
#include<iostream>
using namespace std;

int main() {
	set<int> st;
	st.insert(3);
	st.insert(5);
	st.insert(2);
	st.insert(3);
	for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
		printf("%d", *it);//不支持*(it+i) 2 3 5注意自动排序了
	}
	return 0;
}
  • 常用函数
//insert(x)将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN)
//find(value)返回set中对应值为value的迭代器T=O(logN)
//例子

```cpp
#include<set>
using namespace std;

int main() {
	set<int> st;
	for (int i = 1; i <= 3; i++) {
		st.insert(i);
	}
	set<int>::iterator it = st.find(2);//在set中查找2.返回迭代器
	printf("%d\n", *it);
	//printf("%d\n",*(st.find(2));
	return 0;
}

//erase()//删除单个元素或者删除一个区间内的所有元素

//st.erase(it) it为要删除元素的迭代器
//st.erase(value)也可以直接传入值
int main() {
	set<int> st;
	for (int i = 1; i <= 5; i++) {
		st.insert(i);
	}
	st.erase(st.find(1));//使用find()找到100的it,然后erase
	st.erase(2);//直接传value来删除
	
	set<int>::iterator myit = st.find(4);
	st.erase(myit, st.end());
	for (myit = st.begin(); myit != st.end(); myit++) {
		printf("%d ", *myit);//输出 3
	}
	return 0;
}

string

是c语言中char str[]的改进

  • 访问:
//【通过下标访问】
str[i];
//读入和输出整个字符串,只能用cin cout
string str;
cin>>str;
cout<<str;
//如果一定要用printf,要先用c_str()将string转为字符数组
string str="abcd";
printf("%s\n",str.c_str());
//【通过迭代器访问】
for(string::iterator it=str.begin();it!=str.end();it++){
	printf("%c",*it);
}
  • 常用函数
//string的加法,可以将两个string直接拼接
operator+=
//可以用== != < <= > >=比较大小,规则是字典序
//length(),size()返回string的长度,T=O(1),二者基本相同
//insert()
string str1="abcxyz",str2="opq";
str1.insert(3,str2);//往str[3]处插入opq 
//erase()
str.erase(str.begin()+4);//删除四号位(第五位)
str.erase(str.begin()+2,str.end()-1);//删除[first,last)
str.erase(pos,length);//pos为开始index,length为删除个数
//clear(),清空string
//substr()
substr(pos,len)//取出pos位开始,len个字符
//string::npos 是一个常数,其值本身为-1.但是由于是unsigned_int类型,因此也可以认为是unsigned_int类型的最大值。string::npos用于作为find函数失配时的返回值。例string::npos可以看作是-1或者4294967295,程序中都是对的
//find() str.find(str2)当str2是str子串,返回其在str中第一次出现的位置;如果str2不是str子串,返回string::npos
//str.find(str2,pos)从str的pos号位开始匹配str2
//时间复杂度位O(mn)mn位str1和str2的长度
//replace()
str.replace(pos,len,str2);//从pos开始,长度为len的替换为str2
str.replace(it1,it2,str2)//把迭代器[it1,it2)范围的子串替换为str2

map

映射。可以建立各种类型之间的映射。

  • 定义
//键类型和值类型注意 不能用char数组 要用string
map<typename1,typename2> mp;

  • 访问
    (1)通过下标访问
    和访问普通数组一样,也就是对map<char,int> mp来说,可以直接用mp[‘c’]的方式进行访问。要注意map中键是唯一的,就是说mp[‘c’]=20;mp[‘c’]=30;这样会覆盖20.
    (2)通过迭代器访问
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
	printf("%c %d\n",it->first,it->second);

注意,map会以键从小到大的顺序自动排序,字符的话就是a<m<r。这是因为map内部用红黑树实现(set也是),在建立映射的过程中会自动实现从小到大排序。

  • 常用函数
//find(key)返回key的映射的迭代器,T=O(logN)
map<char,int>::itrator it=mp.find('b');
printf("%c %d\n",it->first,it->second);

//erase(it)删除指定元素的迭代器
//erase(key)删除的映射的键
//erase(first,last)起始和终止迭代器(左闭右开)
//size()获取映射对数
//clear()清空

queue

队列,先进先出的容器。

  • 访问
    由于限制了先进先出,只能用front访问队首元素,back访问队尾元素。

  • 常用函数

//push(x)将x入队
//front() back()访问队首和队尾元素
//pop()令队首元素出队
//empty()检测queue是否为空
//size()返回queue内元素个数

priority_queue

在任何时候往优先队列中push元素,优先队列的底层数据结构堆(heap)会随时调整结构,使得每次的队首元素都是优先级最大的。

//数字大的优先级大
priority_queue<int> q;
priority_queue<int,vector<int>,less<int>> q;
//数字小的优先级大
priority_queue<int,vector<int>,greater<int>> q;

//结构体
//若希望水果价格高的优先级大,要重载<
//若希望价格低的优先级大,return改成>
//注意重载大于号会出错,只用重载小于号
struct fruit{
	string name;
	int price;
	friend bool operator < (fruit f1,fruit f2){
		return f1.price<f2.price;
	}
};

stack

栈,先进后出 。
常用函数:

push()
top()
pop()
empty()
size()

algorithm头文件下的常用函数

max() min() abs()
//注意abs(x)x必须是整数。浮点数要用math头文件的fabs()
swap(x,y)//交换x y的值
reverse(it1,it2)//将数组指针在[it1,it2)之间的元素或容器的迭代器在[it1,it2)之间的元素反转
next_permutation();//给出一个序列在全排列中的下一个序列
do{
	printf("%d%d%d",a[0],a[1],a[2]);
	}while(next_permutation(a,a+3)

fill()//把数组或容器的某一段区间赋值,可以是任意值
fill(a,a+5,233);

sort(a,a+5,cmp)//排序
//
bool cmp(int a,int b){
	return a>b;//可以理解为当a>b时把a放在b前面
}
lower_bound(first,last,val)//寻找在范围内第一个大于等于val元素的位置
upper_bount(first,last,val)//寻找第一个大于val的元素位置

猜你喜欢

转载自blog.csdn.net/weixin_42189888/article/details/107450800