STL的注意事项

template是一个泛化的:
使用template时开始仅仅是声明,具体的例如:k<int> a;叫做实例化
显式实例化:类似k<int>a;明确指出哪种类型;
隐式实例化:类似k<>a;没有说明类型,有编译器自动匹配
特化:(个人认为就是自己制定template 中T的作用)

 

操作符重载:

复习stl:
vector:

 

list不适合查找;
顺序容器和关联容器中都有的成员函数:
erase:删除一个或多个元素
clear:删除所有元素
vecter,deque支持随机访问,支持迭代器的<,>,i=i+2的操作;
stack,queue,priority_queue不支持迭代器
list,set,mulset,map,mulmap为双向,不支持随机访问,无<,>,[]等;
list在使用merge合并时,为从小到大排序的合并;
l.splice(l.begin(),ll,ll.begin(), ll.end());

 

map : 

添加元素:m.insert(make_pair(str_copy, str));
m.insert(pair<string ,string>(str_copy, str));
(multimap与map共用;而m[str]=str1只适合map)
可用迭代器遍历: if (m.count(p->first) == 1)
s.push_back(p->second);
(第一个为p->first ,第二个为p->second)

set :
if (S.size() == lens) ans++;else lens = S.size;
可利用重复元素不进入set中,使用容器内个数是否相等来统计重复元素的 个数
if (s.find(x)!=s.end()) 判断元素是否属于集合(因为如果不属于返回值为s.end())
vector :
查找里面的元素个数:m.size();
list :
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.

 

string :
str1.replace(pos, 3, s2);//replace 的第一参数为下标,第二为个数,第三个为要替换的东西
pos = str1.find(s1, 0);//第一个参数为找的符合s1的字符串,第二个是str1开始查找的位置
str.substr(begin,len);//返还str开始的下标长len的字符串
str.replace(pos,3,s2)//用s2中的字符替换str[pos]开始后三个字符;
数字转string:
for (int i = 1; i <= n; i++)
str += '0' + i;
dequeue :
q.push()//放在队列后
q.front()//访问第一个
q.pop()//删除第一个
q.back()//访问最后一个
注意:为顺序存储结构:
queue :
只能进行pop头,push 尾

注意:为顺序存储结构:

priority_queue:
默认从大到小(less)注意:set从小到大(greater);
从大到小:priority_queue<T,vector<T>,greater<T>> q;
放入其中时,优先级大的放最上面(可查奶牛问题);

algorithm:
使用copy()之前要确保不溢出,string可以考虑reserve;
next_permutation(全排列):
do{cout << str << endl;} while (next_permutation(str, str + strlen(str), cmp));

(可以想把办法使用字符串剪切操作输出全排列的位数)
s = str.substr(0, m);
cout << s << endl;
while (next_permutation(str.begin(), str.end()))
{
if (s != str.substr(0, m))
{
s = str.substr(0, m);
cout << s << endl;
}
}

max_element(begin,end,mycmp);
bool mycmp(const pair<int, int> p1, const pair<int, int > p2)
{
return p1.second < p2.second;
}
(对于mycmp,,,min_element返回最小值的地址)

count(a, a + 5, 'a')//第一个参数为开始地址,第二个为结束的地址,第三个为要找的值
getline(cin,s2,'j');//第一个为从哪读入,第二个为读给的对象,第三个为到那停止(默认换行停止);
sort(vect.begin(),vect.end(),greater<int> ())//默认从大到小

posted @ 2018-02-18 17:23  zzuli风尘  阅读(172)  评论(0编辑  收藏  举报