C++ 泛型
- 头文件:
algorithm
find
代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> using namespace std; int main() { cout << "start!" << endl; int ia[] = {10,20,30}; int *res = find(ia, ia+3, 10); if (res == cend(ia)) //如果没有找到,则res指向end { cout << "can not find" << endl; } else { cout << "find value : " << res-cbegin(ia) << ", " << *res << endl; } cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
- 说明
- find的第一个参数是起始位置,第二个参数是要搜索的末位置的后一位,第三个参数是要寻找的变量值
- 如果找到的话,返回值是指向容器对应位置的地方;没有找到的话,则返回值指向容器的end
- 如果需要对应位置的值,直接
*res
,取对应位置的内容即可。
count
- 说明:按照
C++ primer 5th中的10.1
的练习写的代码 代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> using namespace std; int main() { cout << "start!" << endl; vector<int> v; int r; cout << "Please input vector number" << endl; while (cin >> r) { v.push_back( r ); } cin.clear(); //使输入流重新有效 while (true) { cout << "please input number to find : "; cin >> r; int number = count( v.begin(), v.end(), r ); cout << "find same number : " << number << endl; } cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
- 注意:在
ctrl+z
终止输入后,再次输入时,需要用cin.clear()
来清空缓冲区。
accumulate
- 在头文件
numeric
中 - 说明:前两个参数是迭代器的始末位置,必须是只读的类型,第三个参数是累加的初始值,必须显式创建,否则会不知道其类型。
代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> using namespace std; int main() { cout << "start!" << endl; vector<int> v; for (int i = 0; i < 10; i++) v.push_back(i); int res = accumulate(v.cbegin(), v.cend(), 0); cout << res << endl; vector<string> vs = {"a", "bdsg", "fdr"}; string ress = accumulate(vs.cbegin(), vs.cend(), string("")); cout << ress << endl; cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
fill and fill_n
- 用于给容器的某些元素赋值
- fill是指定要填充的始末和要填充的元素
- fill_n是指定要填充的起始位置和填充个数以及要填充的元素
- fill_n:个数不能超过当前的容量,否则程序会报错。
代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> using namespace std; int main() { cout << "start!" << endl; vector<string> vs = {"a", "bdsg", "fdr"}; fill_n( vs.begin(), vs.size(), string("0") ); fill(vs.begin(), vs.end(), string("23")); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
copy and replace and replace_copy
- copy:复制
- replace:替换
- replace_copy:将源容器中的所有要进行迭代的数据复制到一个新的容器中,是以
back_inserter
的形式插入(在末尾添加的形式) 代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> using namespace std; int main() { cout << "start!" << endl; vector<int> orig; auto it = back_inserter( orig ); for (int i = 0; i < 10; i++) { *it = i; } vector<int> res1( orig.size() ); copy(orig.begin(), orig.end(), res1.begin()); replace( orig.begin(), orig.end(), 0, 233 ); vector<int> res2; replace_copy(orig.begin(), orig.end(), back_inserter(res2), 1, 455); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
sort and unique and erase
- 说明:去除容器中重复的元素
- unique接受排序后的容器列表
代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> using namespace std; int main() { cout << "start!" << endl; string str = "a b c d s f g s e d a s b"; stringstream sstream(str); vector<string> vs; while (sstream >> str) { vs.push_back( str ); } //按照 < 的运算符进行排列,最小的排在最前面 sort( vs.begin(), vs.end() ); //unique接受有序容器,返回值指向不重复区域之后一个位置的迭代器 auto end_unique = unique( vs.begin(), vs.end() ); vs.erase( end_unique, vs.end() ); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
lambda
- 说明:除了可以接受自己的函数参数列表,还可以捕获所在函数的局部变量,并使用在程序中
代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> using namespace std; int main() { cout << "start!" << endl; auto func_add_1 = [](int a, int b) {return a + b; }; cout << func_add_1(3,3) << endl; int num1 = 3; auto func_add_2 = [num1](int num){ return num + num1; }; cout << func_add_2(5) << endl; cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
func_add_1
:传入的参数func_add_2
:捕获列表
bind and count_if
count_if
:记录容器中满足条件的个数,条件可以用lambda表达式
给出bind
:用于修改函数的一些属性,如传参的顺序,可以通过修改占位符来修改传参的顺序代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> #include<functional> //bind using namespace std; bool Smaller(const int &a, const int &b) { return a <= b; } int main() { cout << "start!" << endl; string str = "a by-value capture cannot be modified in a non-mutable lambda"; stringstream sstream(str); vector<string> vs; while (sstream >> str) { vs.push_back(str ); } int cnt = count_if(vs.begin(), vs.end(), [](string str) -> bool{return str.length() >= 8; }); cout << cnt << endl; vector<int> vi = { 1, 4, 6, 8, 2, 5, 3 }; sort(vi.begin(), vi.end(), bind<int>(Smaller, std::placeholders::_2, std::placeholders::_1)); for_each(vi.begin(), vi.end(), [](int n){cout << n << endl; }); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
inserter and front_inserter
inserter
:插入元素后,迭代器的位置指向刚刚插入元素的位置front_inserter
:元素总是插入到第一个迭代器元素之前代码
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> #include<functional> //bind using namespace std; int main() { cout << "start!" << endl; list<int> lst = {1,2,3,4}; list<int> lst2, lst3; copy(lst.cbegin(), lst.cend(), front_inserter(lst2)); copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin())); for_each(lst2.begin(), lst2.end(), [](int num){cout << num << endl; }); for_each(lst3.begin(), lst3.end(), [](int num){cout << num << endl; }); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
istream_iterator
- 流迭代器
说明:可以从流迭代器初始化容器
#include<iostream> #include<exception> #include<fstream> #include<sstream> #include<string> #include<vector> #include<iterator> #include<list> #include<deque> #include<stack> #include<queue> #include<concurrent_priority_queue.h> #include<algorithm> #include<numeric> #include<functional> //bind using namespace std; int main() { cout << "start!" << endl; istream_iterator<int> in_iter(cin), eof; vector<int> vi(in_iter, eof); for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; }); cout << "end!" << endl; system("pause"); return EXIT_SUCCESS; }
输出容器中所有数据的两种方法
for_each
for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; });
copy
ostream_iterator<int> out_iter(cout, "\r\n" ); copy( vi.begin(), vi.end(), out_iter );