迭代器和同一类中的const_iterator的问题

Problems with an iterator and an const_iterator in the same class

本文关键字:const 问题 iterator 一类 迭代器      更新时间:2023-10-16

我正在编写一个类"转换器",我需要两个迭代器,一个常量,另一个更正常。这是有趣的代码区域:

...
iterator begin() {
  iterator i;
  i.puntero=palabras.begin();
  return i;
}
iterator end(){
  iterator i;
  i.puntero=palabras.end();
  return i;
}
...
const_iterator begin() const  {
  const_iterator i;
  i.puntero=palabras.begin();
  return i;
}
const_iterator end() const {
  const_iterator i;
  i.puntero=palabras.end();
  return i;
}
...

有更多的代码,但我认为这并不有趣。

好吧,我需要在 for 循环中使用迭代器,并且在代码失败的这一刻:

  #Work fine
  for(Traductor::iterator it=traductor.begin(); it!=traductor.end(); ++it)
    cout << it->first << endl;
  #Don't work
  for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)
    cout << it->first << endl;

错误是:

 error: conversion from ‘Traductor::iterator’ to non-scalar type ‘Traductor::const_iterator’ requested    for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)

而且我不知道程序如何使用第二个循环中的const_iterator,并且不要尝试使用正常

知道吗?非常感谢。

采用的解决方案:

最后,如果我使用 const traductor则无需将名称更改为 endbegin 方法,但如果traductor不是常量,我需要使用 cendcbegin 方法。

例:

  #When is constant:
  const Traductor tradConst = traductor;

for (Traductor::const_iterator it=tradConst.begin((; it!=tradConst.end((; ++it(

  #When isn't, use diferent methods to differentiate:
  //for (Traductor::const_iterator it=traductor.cbegin(); it!=traductor.cend(); ++it)
...

所以,我有:

const_iterator begin() const {...}
const_iterator end() const {...}
iterator begin() {...}
iterator end(){...}
当我使用常量和非常量对象时

很有用,当我想在非常量对象中使用常量和非常量迭代器时,我将更改方法的名称:

const_iterator cbegin() const {...}
const_iterator cend() const {...}
iterator begin() {...}
iterator end(){...}

非常感谢你们!

除非traductorconst,否则traductor.begin()返回一个iterator

您必须提供接受iteratorconst_iterator 构造函数(或在迭代器中添加operator const_iterator(。

你正在初始化的东西的类型与初始化器中的函数调用如何解决几乎没有关系(阅读:否(。

这意味着,traductorconst时,您的非const begin()end()始终被使用!

您可以通过允许iterator隐式转换为 const_iterator 来解决此问题。还可以选择添加 cbegin()cend() 函数,这些函数明确、始终返回 const_iterator 。在许多情况下,这是"更安全的"。

标准库容器可以同时执行这两项操作。

对象traductor似乎不是一个常量对象。 因此,在此循环中调用了beginend的非常量重载函数

for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)
    cout << it->first << endl;

你可以写

for (Traductor::const_iterator it= const cast<const Traductor &>( traductor ).begin(); it!=const cast<const Traductor &>( traductor ).end(); ++it)
    cout << it->first << endl;

另一种方法是定义函数cbegincend专门用于选择const_iterator