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