C++语言const_iterator和const iterator的区别,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++语言const_iterator和const iterator的区别,相关的知识,希望对你有一定的参考价值。

const_iterator和iterator的区别在于其引用的元素的值能否改变,而不是迭代码本身能否改变.

void f(std::string::iterator iter,std::string::const_iterator citer)

     iter++; // OK
     citer++; // OK
     *iter = 'E';  // OK
     *citer = 'E';  // ERROR, const_iterator引用的对象不能改变。
     citer = iter;  /*一般情况下是可以的,由实现定义,可能有警告.*/
     iter = citer; /*更受限的那一个不可以限给不那么受限的那一个.*/

iterator是可修改,有可能赋值给const_iterator,因为可以被修改的东西,限制为不修改,有可能被准许,反之不然


这类受限情况如:

void f(const int*);
void g(int*);
void h(int* p, const int* cp)

   f(p);
   f(cp);
   g(p); 
   g(cp);// 唯此不可,因const int*更受限,不可作为不那么受限的g的实参.

参考技术A 前一个是标准库定义好的,一个是你自己定义的.
通过简单的代码区别,更能说明问题,希望你能明白
vector<int> ivec;
vector<int>::const_iterator citer1 = ivec.begin();
const vector<int>::iterator citer2 = ivec.begin();
*citer1 = 1; //error
*citer2 = 1; //right
++citer1; //right
++citer2; //error本回答被提问者和网友采纳
参考技术B const_iterator是声明iterator指向的对象是常量,即iterator指向常对象,其本身可以变
const iterator是声明iterator是常量,其指向的对象可以改变,但其本身不能变
eg.
vector<int>::const_iterator iter1 = vec.cbegin();
*iter = 3; //Error
++iter; //Ok
const vector<int>::iterator iter2 = vec.begin();
*iter = 4; //Ok
++iter; //Error

向量、迭代器和 const_iterator

【中文标题】向量、迭代器和 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 限定符。

“*”的作用是什么

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

【讨论】:

以上是关于C++语言const_iterator和const iterator的区别,的主要内容,如果未能解决你的问题,请参考以下文章

c++11中,为啥可以用const_iterator删除map/multimap中的元素

C++ begin( ) cbegin( ) end() cend()区别

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

使用 QT 时 const_iterator 的分段错误

向量、迭代器和 const_iterator

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