今晚参加训练。。。树状数组的练习,傻乎乎的用STL做了一晚,虽然题没做出来,不过对STL的查找有了更深一层的理解。
关于STL。
输入输出
vector push_back pop_back
stack push pop
queue
push pop
头:front() 尾 back()
priority_queue
push pop
头 top 没有尾
List
push_back push_front pop_back pop_front 头:front begin 尾 back end 不过back是最后一个元素的迭代器 而end是最后一个元素的下一个迭代器 L.erase(迭代器) L.reverse() L.sort(cmp) 可自定义cmp,remove(键值),erase(迭代器)。
set 里面元素已经排序而且不接受重复元素
multiset 接受重复元素 insert插入 m.find(值)返回迭代器 remove(值)。
deque 双向队列(一般用deque而不用queue)双向输入 push_back push_front
string 的查找 Str.find(str,index) 返回index开始 第一次出现str的位置
删除排序后的重复字符。str.erase(unique(str.begin(),str.end()),str.end());
关于STL的查找
http://www.cnblogs.com/me115/p/4564709.html
查找有三种,即点线面:
点就是查找目标为单个元素;
线就是查找目标为区间;
面就是查找目标为集合;
查找点 find(迭代器头,迭代器尾,要找的元素)
find包含在 algorithm 的头文件
count(迭代器头,迭代器尾,要找的元素)数数
但是在map里面可以用 mp.count(下标的值)进行数下标。
lower_bound(迭代器头,迭代器尾,要找的元素)
返回第一个不小于给定元素的迭代器。
binary_search() 有序区间的二分查找
返回的是布尔类型
search() 查找子区间首次出现的位置
find()用来查找单个元素,search()则用来查找一个子区间;
示例:从myvector中查找出现子区间[20,30]的位置:
int needle1[] = {20,30};
it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);
if (it!=myvector.end())
std::cout << “needle1 found at position ” << (it-myvector.begin()) << ‘\n’;
一般容器查找 找不到的话都是最后一个迭代器 即==end(),栈和队列没有end()所以这样找无法确定是否找到了。
string 里面find查找 str.find(字符串) 找不到 返回 string::npos,
数组里面的查找 要得到下标的话请减去首地址 int pos=lower_bound(a,a+n,x)-a; 因为这里lower_bound 返回的是地址
既然是队列,也就只有入队、出队、判空、大小的操作,并不具备查找功能。队列不具备查找功能