0%

Iterator in Standard Template Library

紀錄一下STL裡面常用的幾種iterator

reverse_iterator

顧名思義就是將容器從後面往前的順序訪問。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iterator>
#include <iostream>
using namespace std;
int main()
{
char array[] = "abcde";
using backword_iterator = reverse_iterator < char * > ;
backword_iterator it = backword_iterator(array + 5);
backword_iterator itend = backword_iterator(array);
while (it != itend)
cout << *it++;
cout << endl;
}

insert_iterator

共分三種

  • back_inserter 插入在容器最尾端,需要Container有push_back功能,所以只支援vector deque list
  • front_inserter 插入在容器最前端,需要Container有push_front功能,所以之支援deque list
  • insert_iterator 可插入在任何容器的任何位置,需要Contaner有insert功能,所有Container都支援。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iterator>
#include <iostream>
#include <list>
using namespace std;
template <typename T>
void printContainer(const list<T>& lists)
{
for (auto iter = begin(lists); iter != end(lists); ++iter)
cout << *iter;
cout << endl;
}
template <typename T>
insert_iterator<T> make_insert_iterater(T& lists, typename T::iterator iter)
{
return insert_iterator<T>(lists, iter);
}
int main()
{
int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
list<int> integers;
copy(array + 5, array + 10, back_inserter(integers));
printContainer(integers);
using backword_iterator = reverse_iterator < int * >;
copy(backword_iterator(array + 5), backword_iterator(array), front_inserter(integers));
printContainer(integers);
list<int>::iterator iter = integers.begin();
iter++; iter++;
copy(array + 1, array + 3, make_insert_iterater(integers, iter));
printContainer(integers);
}

move_iterator

C++11之後新增的,顧名思義就是加上move semantics,給個範例就很明顯了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>     // std::cout
#include <iterator> // std::move_iterator
#include <vector> // std::vector
#include <string> // std::string
#include <algorithm> // std::copy

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