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 );