向量、迭代器和 const_iterator

Posted

技术标签:

【中文标题】向量、迭代器和 const_iterator【英文标题】:Vector, iterators and const_iterator 【发布时间】:2015-09-21 13:37:01 【问题描述】:

我刚刚开始学习向量和迭代器。我无法理解 2 件事。为什么可以更改常量迭代器,“*”的作用是什么?

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()

    vector<string> inventory;
    inventory.push_back("inventory1");
    inventory.push_back("inventory2");
    inventory.push_back("inventory3");
    vector<string>::iterator myIterator;
    vector<string>::const_iterator iter;
    cout << "Your items:\n";
    for (iter = inventory.begin(); iter != inventory.end(); iter++)
    
        cout << *iter << endl;
    

【问题讨论】:

任何迭代器都可以改变值,除非它被声明为constconst_iterator 将“指向”的对象称为const* 是检索迭代器“指向”的值。 const_iterator 并不意味着迭代器是一个常量,而是你不能改变它所引用的项目。 该代码是正确的。我只是无法忍受为什么“iter”,即 const_iterator,可以改变他的价值,我无法理解你对“*”的意思 我想我应该阅读更多内容以了解您想说什么。 @owacoder - 不要把这个可怜的家伙和指针搞混了。他们很难!严格来说,指针是一种随机访问迭代器。不是反过来。 :-) 【参考方案1】:

当您执行iter = inventory.begin() 时,它会使iter 引用向量中的第一个字符串。 iter++ 移动它以引用下一个字符串。

在输出中,您使用*iter 作为访问iter 引用的字符串的方式。第一个输出将是inventory1

关于 constness 的轻微混淆是

vector<string>::const_iterator   iter;

是一个迭代器,它指代不变的事物,而

const vector<string>::iterator   iter;

将使迭代器本身保持不变,但允许您修改它所引用的对象。

【讨论】:

那么,我用*让迭代器输出它?在此之前,它仅指代但带有 * 我给他访问权限? 但是这里的作用是什么?:'myIterator = inventory.begin(); *myIterator = "inventory4"; cout 【参考方案2】:

为什么我可以改变常量迭代器

您有一个vector&lt;string&gt;::const_iterator 类型的非const 迭代器。您可以更改它,因为它不是const。成为const_iterator 意味着取消引用它会返回对对象的const 引用。这意味着引用的对象不能被修改。

迭代器不是const,因为vector&lt;string&gt;::const_iterator 类型没有const 限定符。

“*”的作用是什么

它是解引用操作符。它返回迭代器当前正在定位的对象。更准确地说,它返回对对象的引用。它的另一个名称是间接运算符

【讨论】:

以上是关于向量、迭代器和 const_iterator的主要内容,如果未能解决你的问题,请参考以下文章

迭代器和向量的 Seg 错误

使用迭代器和向量的插入排序实现

迭代器

迭代const_iterator

你能帮我处理我的 const_iterator 内部类吗?

对于set iterator和const_iterator的输入,不能重载成员函数(但可以用于其他stl迭代器)