C++ 泛型
2016-11-04 00:09
92 查看
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 );
相关文章推荐
- (收藏)Anders Hejlsberg谈C#、Java和C++中的泛型
- More Exceptional C++中文版试读(泛型程序设计与C++标准库)
- C#中的静态构造函数 静态类 C# 泛型和 C++ 模板之间的主要差异
- 将N层集合对象自动转化为对应的.NET泛型对象(C++)
- Boost源码剖析:C++泛型函数指针类function
- C++泛型idioms之一: trait
- C++之歌——求泛型给我安慰
- 实例解析C++/CLI之接口与泛型
- JAVA DotNET C++泛型比较
- Anders Hejlsberg谈C#、Java和C++中的泛型
- C++泛型设计 - 模板规格(译)
- [转]Anders Hejlsberg谈C#、Java和C++中的泛型
- C++和C#之泛型编程对比
- (轉貼) Anders Hejlsberg談C#、Java和C++中的泛型 (.NET) (C#)
- Anders Hejlsberg谈C#、Java和C++中的泛型
- [ZT]Anders Hejlsberg谈C#、Java和C++中的泛型
- 使用C++/CLI泛型实现ORM
- C++ 模板(template)(泛型)入门例子
- C++和java中泛型的区别
- C#和Java的泛型、C++模板、C#的constraints特性以及弱类型化和强类型化的问题(转)