问题标签 [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++ - 实现部分 const 迭代器
我正在用 C++11 中的 K 类型键和 V 类型的值实现一个哈希表模板类。该表的所有内容都存储在std::list <std::pair <K,V> >
. 现在我想以这样的方式实现这个表,客户端只能修改iterator
pair through的第二个元素,而不能修改 pair through 的任何元素。const_iterator
iterator
const_iterator
我的第一个想法只是std::list <std::pair <const K,V> >
用作存储并提供此列表的适当迭代器。问题是当我声明这种类型时std::list
,总是返回begin()
,当我尝试将它转换为使用这种方法时,它不起作用,因为在 libstdc++ 中只接收作为参数(这是 libstdc++ 的一个错误)。所以我不能投到.end()
const_iterator
iterator
erase
iterator
const_iterator
iterator
我怎样才能实现这样的迭代器?
c++ - 公开 begin() 和 end() 的 const 和 nonconst 版本以使用智能指针迭代成员向量
//猫.h
// main.cpp
我希望我的 CatLibrary 公开non-const begin()
andnon-const end()
客户端可以在其中迭代指向可变 Cat 的智能指针。并返回指向不可变迭代器的迭代器const begin()
。const end()
然后当客户端迭代 const CatLibrary 时,我不会担心他会修改库中 Cat 的内容。
但是const
添加到我的成员函数begin()
中仅将指针限定为 const 指针,而不是它指向的 Cat。
在不涉及指针的情况下,具有常量的向量使迭代器也指向具有常量的元素。但我希望这种效果也适用于智能指针指向的元素。
我有一种方法可以解决我的问题,但我不确定将来使用会出现什么问题。
在 const 和 nonconst 中维护两个向量
还是有另一种解决方案来解决向量中智能指针的这种常量问题?
c++ - 迭代向量对
我已经编写了以下代码片段,但它似乎不起作用。
它在包含 for 循环的行中引发错误。错误是:
谁能帮我吗?
c++ - C++ const_iterator 没有匹配的构造函数
我正在尝试为我的基于数组的列表类构建一个自定义的 const_iterator 嵌套类。这是课程
但是,当我回到课堂开始、结束等时,如下所示:
我收到一个错误:“在我的 cbegin 和 cend 上没有用于初始化 'ArrayList::const_iterator”的匹配构造函数。我知道这可能是我不了解 C++ 的愚蠢行为。在此先感谢您的帮助!
c++ - 确定迭代器的起始位置
考虑一个对象的 C++ 向量容器,其中包含字段 a 和时间。我们想找到容器中在当前时间之后出现的第一个项目(我们称之为项目 N),然后从较早时间出现的第一个项目开始迭代容器,其中字段 a 具有一定的值(所以基本上,来自 [N-1, inf))。假设未找到该属性,我们将对整个列表执行第二次迭代。
下面的代码会起作用吗?(在示例中,我们希望找到 a >= 5 的最新项目)。有一个更好的方法吗?
c++ - 矢量迭代器的分段错误
为什么当我尝试输出值时这段代码会产生分段错误?
由于行
cout << *rit_j 导致分段错误;
c++ - Iterator VS const_iterator,与 distance() 一起使用
只是一个问题,关于 const_iterator 与迭代器的使用。更具体地说,使用 distance()。下面是一些基本代码,它们只是整理出用户输入的“fav_games”列表(在应用程序的早期)。我还想删除向量的“索引”,以便打印出编号列表。
部分代码:
我的问题是为什么“const_iterator”不起作用,而我被迫使用“iterator”。寻找它背后的“理论”。“distance()”似乎是期待和“迭代器”——而不是“const_iterator”。..为什么?
如果我使用“const_iterator”,仅供参考编译错误:
错误 1 错误 C2782: 'iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)' : 模板参数 '_InIt' 不明确 z:\micah\c++\favgames\favgames\favgames.cpp 49 1 favgames
谢谢!
c++ - 如何定义从自定义迭代器到自定义 const_iterator 的隐式转换
我正在编写一个 STL 风格的“树”容器类。我目前使用具有以下习语的单个类支持 const 和非 const 迭代器:
TreeIterator
就像这样:
问题是,为了保持我的“STL 风格”,操作就像insert_hint
或emplace_hint
应该将const_iterator
参数作为输入,但我需要定义一个隐式转换 from iterator
toconst_iterator
才能按用户预期工作。
我很确定从 a 隐式转换为 aconst iterator
应该没问题const_iterator
,但我不确定在语法上如何做到这一点。对我来说,在模板(或其他机制)上设置某种条件以防止const_iterator
转换为iterator
.
如何定义这种转换?
c++ - `std::string::begin()`/`std::string::end()` 导致迭代器失效?
此代码将 的结果begin() const
与 的结果混合在一起end()
。这些函数都不允许使任何迭代器无效。但是我很好奇end()
不使迭代器变量无效的要求是否begin
实际上意味着该变量begin
可用于end
.
考虑一个 C++98,写时复制的实现std::string
;非常量begin()
和end()
函数会导致复制内部缓冲区,因为这些函数的结果可用于修改字符串。所以begin
上面开始对s
and都有效s2
,但是使用非常量end()
成员导致它不再对s2
生成它的容器有效。
上面的代码使用写时复制实现(例如 libstdc++)产生“意外”结果。libstdc++不是end - begin
与 相同,而是产生另一个数字。s2.size()
是否导致
begin
不再是有效的迭代器进入s2
,它是从中检索的容器,构成“无效”迭代器?如果您查看对迭代器的要求,它们似乎在.end()
被调用后都适用于这个迭代器,所以也许begin
仍然有资格作为一个有效的迭代器,因此没有被无效?上面的代码在 C++98 中定义得很好吗?在 C++11 中,哪个禁止写时复制实现?
从我自己对规范的简要阅读来看,它似乎没有指定,因此可能无法保证begin()
and的结果end()
可以一起使用,即使没有混合 const 和非 const 版本。
c++ - 常规迭代器(或类似的范围/视图类)是否应该从 const_iterator 派生?
使常规迭代器(或类似的范围或视图类)从相应的 const_iterator 派生是一种好习惯吗?
这样做的动机是
- 共享代码,以及
- 当迭代器/视图很大时,避免转换。
例如,考虑 3D 网格的视图,即网格的一部分。它可能包含 1 个指针、3 个大小和 2-3 个步长,总共 384 个字节。
const 和 mutating 版本将具有许多通用功能(您可以对只读 3D 网格进行任何操作)。
上述示例的反动机是 const 视图包含一个 const 指针,因此变异视图必须执行 aconst_cast
才能使用它,或者在非常量指针中添加一个包含相同地址的额外字段。