STL基礎--叠代器和算法
阿新 • • 發佈:2018-12-30
ron advance ++ iso amp ren deque 輸出 區間
1 叠代器 Iterators
5種叠代器類型
- 隨機訪問叠代器: vector, deque, array
// 允許的操作
vector<int> itr;
itr = itr + 5; // itr往前移5步
itr = itr - 4;
if (itr2 > itr1) ...
++itr; // 前置的比後置的快
--itr;
- 雙向叠代器: list, set/multiset, map/multimap
// 允許的操作
list<int> itr;
++itr;
--itr;
- 前向叠代器: forward_list
// 只允許++操作 forward_list<int> itr; ++itr; // 無序容器“至少”提供前向叠代器
- 輸入叠代器: 前向,只能從叠代器讀取
int x = *itr;
- 輸出叠代器: 前向,只能寫到叠代器
*itr = 100;
const_iterator
// 每個容器都有iterator和const_iterator set<int>::iterator itr; set<int>::const_iterator citr; // 只讀訪問 set<int> myset = {2,4,5,1,9}; for (citr = myset.begin(); citr != myset.end(); ++citr) { cout << *citr << endl; //*citr = 3; } for_each(myset.cbegin(), myset.cend(), MyFunction); // Only in C++ 11
2 叠代器函數:
advance(itr, 5); // itr往前移5步 itr += 5;
distance(itr1, itr2); // 策測量itr1和itr2之間距離
叠代器適配器(預定義叠代器)
- 一種特殊且更強大的叠代器
- Insert iterator
- Stream iterator
- Reverse iterator
- Move iterator (C++ 11)
- 插入叠代器 Insert Iterator:
vector<int> vec1 = {4,5}; vector<int> vec2 = {12, 14, 16, 18}; vector<int>::iterator it = find(vec2.begin(), vec2.end(), 16); insert_iterator< vector<int> > i_itr(vec2,it); copy(vec1.begin(),vec1.end(), // 源 i_itr); // 目的 //vec2: {12, 14, 4, 5, 16, 18} // 其他的插入叠代器: back_insert_iterator, front_insert_iterator
- 流叠代器 Stream Iterator:
vector<string> vec4;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(vec4));
copy(vec4.begin(), vec4.end(), ostream_iterator<string>(cout, " "));
// 更簡潔的寫法:
copy(istream_iterator<string>(cin), istream_iterator<string>(),
ostream_iterator<string>(cout, " "));
- 反向叠代器 Reverse Iterator:
vector<int> vec = {4,5,6,7};
reverse_iterator<vector<int>::iterator> ritr;
for (ritr = vec.rbegin(); ritr != vec.rend(); ritr++)
cout << *ritr << endl; // prints: 7 6 5 4
- 移動叠代器 Move Iterator:
int main () {
std::vector<std::string> foo (3);
std::vector<std::string> bar {"one","two","three"};
typedef std::vector<std::string>::iterator Iter;
std::copy ( std::move_iterator<Iter>(bar.begin()),
std::move_iterator<Iter>(bar.end()),
foo.begin() );
// bar now contains unspecified values; clear it:
bar.clear();
std::cout << "foo:";
for (std::string& x : foo) std::cout << ‘ ‘ << x;
std::cout << ‘\n‘;
return 0;
}
算法 Algorithms
* - 大部分是循環
* 當你的代碼中出現循環的時候,可以考慮是不是能用STL算法
*/
vector<int> vec = { 4, 2, 5, 1, 3, 9};
vector<int>::iterator itr = min_element(vec.begin(), vec.end()); // itr -> 1
// 註1: 算法總是在半開區間上處理: [begin, end)
sort(vec.begin(), itr); // vec: { 2, 4, 5, 1, 3, 9}
reverse(itr, vec.end()); // vec: { 2, 4, 5, 9, 3, 1} itr => 9
// 註2: 算法總是假設目的地有足夠的空間
vector<int> vec(3);
copy(itr, vec.end(), // Source
vec2.begin()); // Destination
//vec2至少要有3個元素的空間
// 註3: 大部分情況下使用成員函數版本
vector<int> vec3;
copy(itr, vec.end(), back_inserter(vec3)); // 插入而不是覆寫
// 返回back_insert_iterator,每次只插入一個,低效
vec3.insert(vec3.end(), itr, vec.end()); // 高效且安全
// 註4: 算法和函數
bool isOdd(int i) {
return i%2;
}
int main() {
vector<int> vec = {2, 4, 5, 9, 2}
vector<int>::iterator itr = find_if(vec.begin(), vec.end(), isOdd);
// itr -> 5
}
// 註5: 算法和原生C++數組
int arr[4] = {6,3,7,4};
sort(arr, arr+4);
STL基礎--叠代器和算法