C++第11课 迭代器与仿函数 (一)
1.迭代器
迭代器:可以说是一种访问容器的一个桥梁,类中类的一个对象,去模仿指针的行为
迭代器分类:
按照定义方式分类:
+ 正向迭代器:
+ 容器名::iterator iter;
+ begin();
+ end();
+ 常量正向迭代器
+ 容器名::const_iterator citer
+ cbegin();
+ cend();
+ 反向迭代器
+ 容器名::reverse_iterator riter
+ rbegin();
+ rend();
+ 常量的反向迭代器
+ 容器名::const_reverse_iterator rciter
+ crbegin();
+ crend();
按照访问方式:
+ 正向访问
+ 双向
+ 随机访问
内置迭代器
| array | 随机迭代器 |
| -------------------------------- | ------------ |
| vector | 随机迭代器 |
| deque | 随机迭代器 |
| list | 双向 |
| set/multiset | 双向 |
| map/multimap | 双向 |
| stack以及queue以及priority_queue | 不支持迭代器 |
迭代器的辅助函数
+ advance(iter iter,int n); 把iter 移动到 iter+n;
+ distance(iterator begin,iterator end); end如果在begin的前面,就会死循环
+ iter_swap(iteartor first,iterator second); 交换两个迭代器指向的值
流型迭代器
+ 输出流型迭代器
+ ostream_iterator<type> iteratorObject(ostream object);
+ ostream_iterator<type> iteratorObject(ostream object,const char* str);
+ iteratorObject=value; 直接value数据打印到屏幕上
+ 输入流型迭代器
+ istream_iterator<type> iteratorObject; 代表一个end_of_stream
+ istream_iterator<type> iteratorObject(istream object);
+ *iteratorObject, 等效做cin>>操作
int main() { vector<int> intData = { 1,2,3,4,5,6,7 }; vector<int>::iterator iter = intData.begin(); while (iter != intData.end()) { cout << *iter << "\t"; iter++; } cout << endl; vector<int>::reverse_iterator rIter; for (rIter = intData.rbegin(); rIter != intData.rend(); rIter++) { cout << *rIter << "\t"; } cout << endl; cout << "size:" << distance(intData.begin(), intData.end()) << endl; //交换第一个元素和最后一个元素 //list iterator //array[7] array[0] array[6] array[7]---end iter_swap(intData.begin(), intData.end() - 1); //最后一个元素的位置是end-1 for (auto v : intData) { cout << v << "\t"; } cout << endl; //copy算法 //copy(begin,end,begin) int array[3] = { 4,4,4 }; vector<int> first = { 1,2,3 }; //list<int> second; //copy(first.begin(), first.end(), second.begin()); copy(array, array + 3, first.begin()); for (auto v : first) { cout << v << "\t"; } cout << endl; //输出流型迭代器 ostream_iterator<int> coutOject(cout); coutOject = 123; cout << endl; copy(first.begin(), first.end(), ostream_iterator<int>(cout)); cout << endl; copy(first.begin(), first.end(), ostream_iterator<int>(cout, "\t")); cout << endl; string str = "*"; copy(first.begin(), first.end(), ostream_iterator<int>(cout, str.c_str())); //输入流型迭代器 istream_iterator<int> endOfStream; //无参构造的一个错误流 istream_iterator<int> inputNum(cin); //用来做输入 while (inputNum != endOfStream) { first.push_back(*inputNum); ++inputNum; } cout << "Data:" << endl; for (auto v : first) { cout << v << "\t"; } cout << endl; return 0; }