【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
以下内容大多摘自《C++标准程序库》
算法实例
STL提供了一些标准算法,包括搜寻、排序、拷贝、重新排序、修改、数值运算等。算法并不是容器类别的成员函数,而是一种搭配迭代器使用的全局函数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> coll;
vector<int>::iterator pos;
//coll.push_back(2);
coll.push_back(5);
coll.push_back(4);
coll.push_back(1);
coll.push_back(6);
coll.push_back(3);
pos = min_element(coll.begin(),coll.end()); //寻找最小值
cout << "min:" << *pos << endl;
pos = max_element(coll.begin(), coll.end());//寻找最大值
cout << "max:" << *pos << endl;
sort(coll.begin(),coll.end()); //排序
cout << "sort:";
for (pos = coll.begin(); pos != coll.end(); ++pos) {
cout << *pos << ' ' ;
}
cout << endl; //这里输出的是 1 2 3 4 5 6
pos = find(coll.begin(),coll.end(), 3); //找到值为3的第一个元素
cout << "find:";
cout << *pos << endl;
reverse(pos,coll.end()); //反转pos及以后的所有元素,因为前面把pos知道了3的位置,所以这样操作就是反转3到以后的元素,前面的find()就是用来打辅助的
for (pos = coll.begin(); pos != coll.end(); ++pos) {
cout << *pos << ' ';
}
cout << endl;
system("pause");
}
最后输出:
min:1
max:6
sort:1 3 4 5 6
find:3
1 6 5 4 3
区间
为了使用算法,我们一般将区间首尾当做两个参数来传给算法,而不是一口气将整个容器传递进去。这里面调用者必须保证两个参数定义出来的区间是有效的,也就是从起点出发,逐一前进,能够到达终点,也就是说,必须确保两个迭代器隶属于同一容器,且前后放置必须正确。同时,所有算法处理的都是半开区间[begin,end).
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main() {
list<int>coll;
list<int>::iterator pos;
for (int i = 20; i <= 40; ++i) {
coll.push_back(i);
}
pos = find(coll.begin(),coll.end(),3);
reverse(pos,coll.end());
list<int>::iterator pos25, pos35; //这里声明了区间的前后两个迭代器
pos25 = find(coll.begin(), coll.end(), 25);
pos35 = find(coll.begin(), coll.end(), 35); //这里使得两个迭代器都属于同一个容器。
cout << "pos35:" << *pos35 << endl;
cout << "max:" << *max_element(pos25, pos35) << endl;
cout << "max:" << *max_element(pos25, ++pos35) << endl;
system("pause");
}
结果为:
pos35:35
max:34
max:35
意思是说,pos35已经指向了35的位置,所以输出时,输出的值是35,但是作为区间传入算法时,由于是半开区间,前面是闭区间,后面是开区间,所以该算啊并不包括35,所以最后的结果是max=34,需要让后面的参数加一才能得到我们所想要的35.
值得一提的是,本次使用的是list,是双向迭代器,只能以++来获得pos35的下一个位置,但如果是vector或者deque等随机存取迭代器,则可以写pos35+1.因为随机存取迭代器允许迭代器算数运算。
确定两个区间参数谁前谁后可以通过如下方法确定:
pos25=find(coll.begin(),coll.end(),25);
pos35=find(coll.begin(),pos25,35);
if(pos25!=pos35){
//pos35在pos25之前(说明该上面那个式子pos35在到达pos25之前就已经找到了值)
}
else{//说明pos35在开始到pos25之间并没有找到值(此时pos35已经指到了pos25)
pos35=find(pos25,coll.end(),);//让pos35从pos25开始往后面找,这个是为了判断是否pos25=pos35
if(pos35!=pos25){
//说明pos35在pos25后面了
}
else{
//说明两个相等
}
}
处理多个区间
有数个算法可以同时处理多个区间,通常必须先设定第一个区间的起点和终点,至于其他区间,只需要设定起点即可,终点通常可以由第一区间的元素数量推导出来,但是这样就需要确保第二个或者其他区间所拥有的元素个数,至少和第一区间内的元素个数相同。
#include <iostream>
#include <list>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
int main() {
list<int>coll1;
vector<int>coll2;//刚开始这样定义出来coll2是空的,它需要先添加新的元素然后再赋值
for (int i = 1; i <= 9; ++i) {
coll1.push_back(i);
}
// copy(coll1.begin(), coll1.end(), coll2.begin()); //这样copy是有问题的,因为coll2没有足够的元素供copy
coll2.resize(coll1.size());//这是一种方法,resize可以改变元素个数,来保证第二个元素跟第一个元素一样多
copy(coll1.begin(),coll1.end(),coll2.begin());
deque<int>coll3(coll1.size());//这也是一种方法,在初始化的时候就已经定义了元素的个数,并且已经将这些元素初始化为0了。
copy(coll1.begin(), coll1.end(), coll3.begin());
system("pause");
}
以上两种方法都产生了新元素,并对元素进行了初始化(初始化为零)。
来源:oschina
链接:https://my.oschina.net/u/4433424/blog/3153635