泛型算法前三节
算法是操作迭代器,算法永远不会执行容器的操作,只会在容器中移动元素但永远不会直接添加和删除元素。
简单的算法复习:
count 查找vector里面的 数字多少次 返回
auto result = count(vec.begin(),vec.end(),8);
accumulate 求一个vector<int >中的元素之和
int sum = accumulate(vec.begin(),vec.end(),0);
第三个参数说明 加的东西是什么类型,如果vector里面的是string 对象,那么在第三个参数填上""就行了
在泛型算法中,参数很重要,需要明确知道参数的作用,还有重载的参数也好多,需要特别注意。
另外,算法的迭代器参数有可能不是同一个容器的。
特殊的迭代器,插入,流,反向
插入迭代器 insert iterator,可以向一个容器中插入数据
auto it = front_inserter(vec);//从前面插入,必须要支持push_front
auto it = back_inserter(vec); //从后面插入
auto it = inserter(vec,vec,begin());//从迭代器位置开始插入
*it = val ; //这样就插入了
等于如下操作:
it = vec.insert(it,vec.begin());//插入
it++; //递增it使它指向原来的元素
vector<string> vec{ "happynery","some","fox","school","parsongers for","fox","the","pasenger","sanyuan" };
list<string> lis;
sort(vec.begin(), vec.end());
unique_copy(vec.begin(), vec.end(), back_inserter(lis));
for (auto &m : lis)
cout << m << endl;
流迭代器:绑定在输入或者输出流上的迭代器;
istream_iterator<int> in(cin); //从CIN读取int
istream_iterator<int> eof; //尾部迭代器
vector<int>vec(in,eof); //从流迭代器初始化vector
ostream_iterator<int> out_iter(cout, " ");
for (auto &e : vec)
*out_iter++ = e; // *和++运算符其实对输出流迭代器不做任何事情,这里是为了使其他的使用保持一致;
cout << endl;
可以通过调用 copy 来打印vec的内容;
copy(vec.begin(),vec.end(),out_iter);
cout<<endl;
// 使用流迭代器读取一个文本文件,存入一个vector中的string里
ifstream in("shader.vs");
if (!in) {
cout << "读取文件失败" << endl;
}
istream_iterator<string> in_it(in);
istream_iterator<string> eof;
//高能预警,高级初始化
vector<string> vecStr(in_it,eof);
//版本2,循环push_back
while(in_it != eof){
vecStr.push_back(*in_it++);
}
//华丽的分界线
for (auto &elem : vecStr)
cout << elem << endl;
//使用流迭代器,sort copy 从标准输入读取一个整数序列,将其排序,打印不重复的元素
istream_iterator<int> in_it(cin);
istream_iterator<int> eof;
vector<int> vecInt(in_it,eof);
sort(vecInt.begin(),vecInt.end());
ostream_iterator<int> out(cout, "\n");
unique_copy(vecInt.begin(), vecInt.end(), out);
//自己看得懂
int main(int argc,char**argv) {
if (argc != 4) {
cout << "please in put file name out filename :";
return -1;
}
ifstream in(argv[1]);
istream_iterator<int> in_it(in);
istream_iterator<int> eof;
ofstream out1(argv[2]);
ofstream out2(argv[3]);
ostream_iterator<int> out_it1(out1, "\n");
ostream_iterator<int> out_it2(out2, " ");
while (in_it != eof)
{
if (*in_it % 2 == 0)
{
*out_it1++ = *in_it++;
}
else
{
*out_it2++ = *in_it++;
}
}
system("pause");
return 0;
}
反向迭代器:向后移动的迭代器;
移动迭代器:专门移动迭代器的迭代器;
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <list>
#include <deque>
#include <forward_list>
#include <stack>
#include <algorithm>
#include <functional>
using namespace std;
void elimDups(vector<string> &words) {
//按字典排序
sort(words.begin(), words.end());
//unique 重排输入范围,使得每个单词只出现一次
//排列在范围的前部,返回指向不重复区域之后的一个位置的迭代器
auto end_unique = unique(words.begin(), words.end());
//使用向量操作来删除重复的单词
words.erase(end_unique, words.end());
}
bool compare(const string &str1, const string &str2) { return str1.size() > str2.size(); }
bool bigsize(const string &str1, string::size_type sz) {
return str1.size() >= sz;
}
string make_plural(size_t ctr, const string &word, const string &ending) {
return (ctr > 1) ? word + ending : word;
}
void biggise(vector<string> &words, vector<string>::size_type sz) {
elimDups(words);
stable_sort(words.begin(), words.end(), compare);
auto wc = find_if(words.begin(), words.end(),bind(bigsize,std::placeholders::_1,sz));
auto count = words.end() - wc;
cout << count << " " << make_plural(count, "word", "s")
<< "of length" << sz << "or longer" << endl;
for_each(wc, words.end(),
[](const string &s) {cout << s << " "; });
cout << endl;
}
int main() {
vector<string> vec{ "happynery","some","fox","school","parsongers for","fox","the","pasenger","sanyuan" };
biggise(vec,5);
system("pause");
return 0;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于