问题标签 [const-iterator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 取消引用迭代器会导致“无法转换”错误,而它似乎不应该
使用 VS 2008,目标环境是带有 ARM 处理器的 Windows CE,如果这有所不同的话。我知道我们使用的编译器也有点过时了......
我遇到的基本问题是我正在尝试为我编写的地图包装器制作自己的迭代器,并且重载 operator->() 给我带来了麻烦。这是给我带来问题的代码:
我知道通常返回一个 const 变量并没有什么意义,但我似乎无法弄清楚如何以一种让程序的其余部分在不这样做的情况下保持 const 正确的方式做到这一点。
我得到的错误是这样的:
错误 C2440:'return':无法从 'const std::pair<_Ty1,_Ty2> *' 转换为 'const std::pair<_Ty1,_Ty2> *'
此迭代器的标头如下所示:
如您所见,m_MapIter 和重载运算符的返回值是相同的...我从项目的这一部分的 .h 和 .cpp 文件中取出所有 const 语句并重新编译时出现相同的错误,所以我认为这不是问题。
如果我改为这样做,程序将编译:
我知道这样做会导致内存泄漏,我没有将它放入智能指针中只是为了节省发布空间。
这是整个 .cpp 文件,以防您发现相关:
ObjectMapIterator 定义位于 ObjectMap.h 文件中。所以我不会忘记包含 ObjectMapIterator。
我已经为此挠头太久了。请让我知道,如果你想出任何办法。谢谢!
c++ - 它无法从它的对应迭代器中定义一个 const_iterator
我正在使用自定义容器扩展 stl 容器,以便对元素的操作提供更灵活的控制
这段代码运行正常,如果我使用迭代器如下
但是如果我将迭代器更改为 const_iterator,它将无法编译。我读了一些文章,其中提到要定义常量迭代器,我们只需将 value_type 从 X 替换为 X const,这就是我在代码中所做的。但是我很快发现它在我的情况下可能不起作用,因为迭代器返回的引用在我的情况下是容器本身。我不知道如何在不重复编码的情况下使 const_iterator 工作。
此外,我的迭代器派生自 std::iterator 但我发现我无法覆盖我的迭代器的构造函数。除了 T *pt 之外,我可以通过任何方式将多个参数传递给我的迭代器吗?谢谢。
c++ - cbegin/cend 背后的原因是什么?
我想知道为什么cbegin
并cend
在 C++11 中引入?
begin
在哪些情况下调用这些方法与和的 const 重载有所不同end
?
c++ - 通过不影响不变量的集合的 NON-const 迭代器访问成员
假设我有这样的代码:
我如何向编译器保证编写 MoreFields 不会影响任何不变量或不会做任何事情来使集合中元素的顺序无效?
如果唯一的办法是使用另一个容器,例如向量,我如何在排序位置插入一个新值,同时检查一个是否已经存在?
c++ - 插入返回迭代器
我正在实施class graph
。类似于stl
,我认为插入函数的签名应该是
pair<iterator,bool> insert ( const value_type& x );
对于我的班级,我已经实现了iterator
和const_iterator
. 我是否应该定义 2 个 i(重载)insert
函数:一个将返回pair<iterator,bool>
,第二个将返回pair<const_iterator,bool>
c++ - const_iterator 和 const_iterator::value_type 的 constness
为什么在 STL 中
是同一类型
为什么会这样设计?第一个不应该是const T而第二个不应该是T吗?您应该如何采用迭代器的底层 const 正确类型?我知道您可以编写自己的模板类和专业化并从中获取
但不应该有一个成员 typedef 持有它吗?
c++ - 传递 map<>::iterator 作为 map<>::const_iterator &
我在 GCC 上将 map<...>::iterator 对象作为 const_iterator & 传递给函数时遇到问题:
我的问题是,在 Visual Studio 2010 上,上面的代码工作得非常好,但在 GCC 4.1.2 上,我收到一个错误,指出函数调用没有匹配函数,对于 _GetInstList(it, SomeString)。问题似乎是将迭代器转换为 const_iterator &。
我必须通过引用来获取它,因为“它”在 _GetInstList() 内部发生了变化,并且调用者函数会检查它。(“it”指针被改变而不是指向元素)。
此外, SomeFunction() 中的“它”不能是 const,因为它改变了一个元素。
我该如何解决这个问题?
编辑:对于那些认为问题是从迭代器到 const_iterator 的转换的人:如果将函数原型更改为以 const_iterator NOT 作为参考,则代码编译得很好,问题是 const &。
c++ - 如何使用 const_iterator 公开 C++ 类
我正在使用Boost.Python来公开第 3 方 C++ API。
我来的头文件声明了一个可迭代类(hasbegin
和end
方法),以及一个用于进行迭代的自定义迭代器类:-
我创建了从这些派生的最小包装类:-
还有 Boost.Python 声明:-
这里唯一的奇怪之处似乎是const_iterator
typedef 的使用。这在 Boost.Python迭代器文档中有所描述,据我所知,它所需要的只是的模板参数const
中的限定符。iterator
IE
但是,这会导致以下编译器错误,在 Linux x86_64 上使用 GCC 4.7.2:-
应该如何暴露这样一个可迭代的类?
干杯,亚历克斯
c++ - 将基于自定义模板的迭代器类的对象转换为 const_iterator
我正在大学学习 OOP 课程(C++ 是基础语言)。我的任务是实现自己的链表模板容器类。我几乎完全做到了,但遇到了问题。众所周知,STL 提供iterator
和const_iterator
类用于通过列表进行迭代。它们的实现几乎相同,主要区别在于迭代器的方法返回引用,而 const_iterator 的方法——常量引用。我遵循https://stackoverflow.com/a/3582733/2108548并创建了单独的模板类ListIterator
。然后我用typedef
classesIterator
和ConstIterator
class声明List
。
我得到了这样的东西:
在我决定制作 "copy-constructor" Iterator
->之前,一切都很好ConstIterator
。所以我需要构造函数方法来获取ListIterator<T>
(T
数据类名称在哪里)并创建新的对象类型ListIterator<T const>
。但实际上ConstIterator
的构造函数是T const
作为模板参数获取的,所以我需要删除const
构造函数的参数。我找到了执行此操作的标题type_traits
。所以我写了“复制构造函数”: typedef typename std::remove_cv::type NoConstT; ListIterator(ListIterator const &other);
但它不起作用!请求 const_begin() 后出现此错误:
但这还不是全部。为了实现我的目标,我也必须转换ListNode<T>
为ListNode<T const>
。但是我还有一个问题:每个列表节点都包含指向前一个和下一个节点的指针,如果我尝试在节点的构造函数中初始化它们,我将得到递归。当然,我可以创建函数来处理通过迭代将所有ListNode<T>
节点转换为。ListNode<T const>
但我不喜欢这个解决方案:它有巨大的开销!
我问了我的老师这个问题。他愣了几分钟没看懂,等他明白了才说:“初级!” ——“但我坚持了 3-4 个小时!” — “如果是这样,请丢弃 const 迭代器并在没有它们的情况下完成列表容器。我需要时间来理解您的代码”(正如您所见,我的代码在我看来非常简单)。据我了解,他不知道这个问题的答案。但我真的很想知道怎么做!我怎么解决这个问题?
抱歉有很多错误——我不是以英语为母语的人。
c++ - c++11:使用 const_iterator 擦除
我相信从 C++11 开始,erase
大多数容器(例如std::vector
)的函数都接受 aconst_iterator
作为参数:
即使使用--std=c++11
.
它是编译器/libstdc++ 错误,还是我做错了什么?这是一个示例代码: