a327904410 发表于 2022-6-15 17:51:15

STL的迭代器问题

问下下面三种遍历为什么都能输出答案,按道理来说指针指向的地址遍历的时候不是加了吗?怎么会回到第一个元素了?{:10_266:}

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void print(int val) {
        cout << val << " ";
}

void test() {
        vector<int> v;        // 创建 vector 容器对象,并通过模板参数指定容器中存放数据的类型

        v.push_back(1);        // 向容器中放数据(尾插法)
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);

        /*        每个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
                v.begin() 返回迭代器,这个迭代器指向容器中第一个数据
                v.end() 返回迭代器,这个迭代器指向容器最后一个元素的下一个位置
                vector<int>::iterator 拿到 vector<int> 这种容器的迭代器类型
        */

        // 第一种遍历方法
        vector<int>::iterator pBegin = v.begin();        // v.begin() 相当于指针
        vector<int>::iterator pEnd = v.end();

        while (pBegin != pEnd) {
                cout << *pBegin << " ";
                pBegin++;
        }
        cout << endl;

        // 第二种遍历方法
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
                cout << *it << " ";
        }
        cout << endl;

        // 第三种遍历方法
        for_each(v.begin(), v.end(), print);
        cout << endl;
}

int main() {
        test();
        return 0;
}

wp231957 发表于 2022-6-15 20:58:04

v.begin()    v.end()   这俩标志又没有动

a327904410 发表于 2022-6-16 00:30:36

wp231957 发表于 2022-6-15 20:58
v.begin()    v.end()   这俩标志又没有动

它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

傻眼貓咪 发表于 2022-6-16 08:25:54

a327904410 发表于 2022-6-16 00:30
它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后,q 指向的地址一样不变

傻眼貓咪 发表于 2022-6-16 08:46:56

a327904410 发表于 2022-6-16 00:30
它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

而且 v.begin() 和 v.end() 不是指针,而是函数。

a327904410 发表于 2022-6-16 13:59:21

傻眼貓咪 发表于 2022-6-16 08:25
假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后 ...

这样的嘛,那是我理解错了

a327904410 发表于 2022-6-16 14:06:07

傻眼貓咪 发表于 2022-6-16 08:25
假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后 ...

我可能把这个和 根据地址修改值导致原来指向该地址指针的值也会改变的概念 混淆了,仔细想想地址确实不会变。。。{:10_333:}
页: [1]
查看完整版本: STL的迭代器问题