问题标签 [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++ - STL 旋转 unique_ptrs 的 const_iterators
我在unique_ptr 中间的const_iterator 上使用std::rotate 时遇到问题。
我试过了:
这导致调用 rotate(...iterator, ...const_iterator &, ...iterator) 没有匹配的函数
因此我尝试了这个: std::vector >::const_iterator first = vec.begin(); std::vector >::const_iterator last = vec.end(); 标准::旋转(第一,中间,最后);
然后它会给出一堆错误消息,如下所示。这是一个错误还是我犯了一些错误?
c++ - 分解技术找到类似的方法?
我正在寻找一种技术来寻找类似的方法。问题如下。我需要一个容器上的 find 方法,该方法不需要修改容器内容来进行搜索。但是,它应该有一个 const 和一个非常量版本,因为在返回迭代器而不是 const_iterator 的情况下,它可能导致容器的修改。在这两种情况下,代码将完全相同,只有访问器将被评估为 constXXX 或 XXX 并且编译器将完成这项工作。从设计和维护的角度来看,将这两种方法实现两次并不明智。(而且我真的很想避免为此使用宏......)我的意思也很好地说明了 stl_tree.h 中 stl 的 gcc 实现中的那段代码:
您可以看到方法的原型不同,但实现中编写的代码实际上是相同的。
我想出了两种可能的解决方案:第一种是使用 const_cast,另一种是使用辅助模板结构。我在这里制作了这两种方法的一个简单示例:
这可能是一个众所周知的问题,我想知道是否有一些 c++ 大师想出了一个好的设计模式来解决这个问题。特别是我想知道是否有人认为这两种方法中的一种存在问题(特别是在性能方面)。由于第一个更容易理解,我更喜欢它,尤其是在阅读了以下内容之后: Constants and compiler optimization in C++ 这似乎让我不必担心编写 const_cast 并破坏我的表现。
提前谢谢你,干杯,
曼努埃尔
c++ - C++ 迭代器到 const_iterator
如何在 C++ 中const_iterator
从(该容器类的)获取(某个容器类的) ?iterator
aconst_iterator
来自 ainsert_iterator
呢?结果iterator
应该指向与原始位置相同的位置。
c++ - reverse_iterator 适配器
我正在尝试为我的迭代器和 const_iterator 类实现一个反向迭代器适配器,但有点麻烦。如果有人能指导我完成这个,那将不胜感激!
这个想法是我应该能够从我的 rbegin() 和 rend() 函数调用创建一个反向迭代器
我在课堂上使用以下 typedef:
如您所见,我希望能够使用模板创建反向迭代器,为 reverse_iterator 类提供迭代器或 const_iterator。
不幸的是,这就是我坚持的一点......
下面是我目前拥有的类定义,有错误。
我以前从未使用过这样的模板,所以很可能我完全误解了它们的使用方式......
由于 I 可以是迭代器或 const_iterator,因此引用和指针的 typedef 在两个类之间会有所不同。未编译的行是这些:
如果我不能执行 I::reference 和 I::pointer,我不确定如何使一个 reverse_iterator 类同时适用于迭代器和 const_iterator。我还尝试在这些前面添加模板,因为它们在迭代器类(例如)中定义为:
c++ - 用指针理解 const_iterator?
我试图理解 const_iterator 的含义。我有以下示例代码:
Refresh()
是Customer
类中的一个方法,它没有被定义为 const。起初我以为 const_iterator 应该禁止修改容器的元素。但是,此代码可以毫无怨言地编译。这是因为发生了额外的间接级别吗?const_iterator 究竟是做什么/意味着什么?
更新
在这种情况下,使用 const_iterator 是最佳做法吗?
c++ - 如何实现 STL 风格的迭代器并避免常见的陷阱?
我创建了一个集合,我想为其提供一个 STL 风格的随机访问迭代器。我正在四处寻找迭代器的示例实现,但没有找到。我知道[]
和*
运算符的 const 重载的需要。迭代器要成为“STL 风格”的要求是什么?还有哪些需要避免的其他陷阱(如果有的话)?
附加上下文:这是一个库,我不想引入任何对它的依赖,除非我真的需要。我编写了自己的集合,以便能够使用相同的编译器提供 C++03 和 C++11 之间的二进制兼容性(因此没有可能会破坏的 STL)。
c++ - c++ stl const迭代器和const指针
我对这个 const 关键字的含义有点困惑 我有一个这样的类
我已经从上面的代码中得到了 oper() 的 const 版本。所以我无法想象如果我将 std::list::iterator 更改为 std::list::const_iterator 会得到什么。
c++ - 奇怪的 const_iterator 行为
我正在做一个 main.cpp 来测试我对稀疏矩阵的实现,我在其中创建了两个 const_iterator:
问题是它不调用 begin 和 end (它甚至不做初始 cout),但如果我创建两个迭代器,它就可以工作。这是我为 const_iterators 实现 begin 和 end 的方式。
我注意到的一件奇怪的事情是,如果我在 SparseMatrix 的类方法中创建两个 const_iterators,它们就可以工作。
c++ - Valgrind 说 const-iterator 试图访问未初始化的空间,但实际上它是
我正在尝试使用 const_iterators 来遍历元素列表(矩阵的元素)。
但正如 valgrind 报告的那样,有些地方出了问题。
==4662== 使用大小为 8 的未初始化值
==4662== 在 0x403A19: SparseMatrix::findRow(int) const (SparseMatrix.h:120)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== 由 0x401D63: 主要 (main.cpp:121)
==4662==
==4662== 大小为 4 的读取无效
==4662== 在 0x403A27: SparseMatrix::findRow(int) const (SparseMatrix.h:123)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== 由 0x401D63: 主要 (main.cpp:121)
==4662== 地址 0xa680020611a25ff 没有被堆栈、malloc 或(最近)释放
==4662==
==4662==
==4662== 进程以信号 11 (SIGSEGV) 的默认操作终止
==4662== 一般保护故障
==4662== 在 0x403A27: SparseMatrix::findRow(int) const (SparseMatrix.h:123)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== 由 0x401D63: 主要 (main.cpp:121)
因为我将 findNext 和 findRow 与普通迭代器和其他类方法一起使用,并且它们可以工作,所以我认为 operator++() 有问题:
const_iterator 的复制构造函数:
此外,在类的方法中创建和使用的 const_iterator 工作得很好。
PS:findRow的代码
它通过了一个 if(tmp==NULL) 检查,所以它认为内存中有一些东西,但是它说它没有初始化,但我再说一遍,如果我使用正常的迭代器它可以工作。
这是 findNext 的代码
构造函数 SparseMatrix(int,int,T) 的代码
如果您需要更多代码,请询问。
此外,让我再次确认我将 findRow 和 findNext 用于其他目的,并且它们可以工作。我认为这与 constness 有关,但无法得到什么。
c++ - 如何更改集合元素?
我想更改 a 中的元素set
,所以我使用了set<T>::iterator
. 但是,编译器认为“元素是 const”。然后我意识到这set<T>::iterator
是一个const_iterator
...
那么,我怎样才能改变元素呢?删除它然后插入一个新的?