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;
【问题讨论】:
任何迭代器都可以改变值,除非它被声明为const
。 const_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<string>::const_iterator
类型的非const
迭代器。您可以更改它,因为它不是const
。成为const_iterator
意味着取消引用它会返回对对象的const
引用。这意味着引用的对象不能被修改。
迭代器不是const
,因为vector<string>::const_iterator
类型没有const
限定符。
“*”的作用是什么
它是解引用操作符。它返回迭代器当前正在定位的对象。更准确地说,它返回对对象的引用。它的另一个名称是间接运算符。
【讨论】:
以上是关于C++语言const_iterator和const iterator的区别,的主要内容,如果未能解决你的问题,请参考以下文章
c++11中,为啥可以用const_iterator删除map/multimap中的元素