问题标签 [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.

0 投票
0 回答
108 浏览

c++ - 实现部分 const 迭代器

我正在用 C++11 中的 K 类型键和 V 类型的值实现一个哈希表模板类。该表的所有内容都存储在std::list <std::pair <K,V> >. 现在我想以这样的方式实现这个表,客户端只能修改iteratorpair through的第二个元素,而不能修改 pair through 的任何元素。const_iteratoriteratorconst_iterator

我的第一个想法只是std::list <std::pair <const K,V> >用作存储并提供此列表的适当迭代器。问题是当我声明这种类型时std::list,总是返回begin(),当我尝试将它转换为使用这种方法时,它不起作用,因为在 libstdc++ 中只接收作为参数(这是 libstdc++ 的一个错误)。所以我不能投到.end()const_iteratoriteratoreraseiteratorconst_iteratoriterator

我怎样才能实现这样的迭代器?

0 投票
3 回答
1160 浏览

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 中维护两个向量

还是有另一种解决方案来解决向量中智能指针的这种常量问题?

0 投票
4 回答
50708 浏览

c++ - 迭代向量对

我已经编写了以下代码片段,但它似乎不起作用。

它在包含 for 循环的行中引发错误。错误是:

谁能帮我吗?

0 投票
2 回答
909 浏览

c++ - C++ const_iterator 没有匹配的构造函数

我正在尝试为我的基于数组的列表类构建一个自定义的 const_iterator 嵌套类。这是课程

但是,当我回到课堂开始、结束等时,如下所示:

我收到一个错误:“在我的 cbegin 和 cend 上没有用于初始化 'ArrayList::const_iterator”的匹配构造函数。我知道这可能是我不了解 C++ 的愚蠢行为。在此先感谢您的帮助!

0 投票
1 回答
55 浏览

c++ - 确定迭代器的起始位置

考虑一个对象的 C++ 向量容器,其中包含字段 a 和时间。我们想找到容器中在当前时间之后出现的第一个项目(我们称之为项目 N),然后从较早时间出现的第一个项目开始迭代容器,其中字段 a 具有一定的值(所以基本上,来自 [N-1, inf))。假设未找到该属性,我们将对整个列表执行第二次迭代。

下面的代码会起作用吗?(在示例中,我们希望找到 a >= 5 的最新项目)。有一个更好的方法吗?

0 投票
1 回答
593 浏览

c++ - 矢量迭代器的分段错误

为什么当我尝试输出值时这段代码会产生分段错误?
由于行

cout << *rit_j 导致分段错误;

0 投票
1 回答
882 浏览

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

谢谢!

0 投票
1 回答
1067 浏览

c++ - 如何定义从自定义迭代器到自定义 const_iterator 的隐式转换

我正在编写一个 STL 风格的“树”容器类。我目前使用具有以下习语的单个类支持 const 和非 const 迭代器:

TreeIterator就像这样:

问题是,为了保持我的“STL 风格”,操作就像insert_hintemplace_hint应该将const_iterator参数作为输入,但我需要定义一个隐式转换 from iteratortoconst_iterator才能按用户预期工作。

我很确定从 a 隐式转换为 aconst iterator应该没问题const_iterator,但我不确定在语法上如何做到这一点。对我来说,在模板(或其他机制)上设置某种条件以防止const_iterator转换为iterator.

如何定义这种转换?

0 投票
4 回答
1055 浏览

c++ - `std::string::begin()`/`std::string::end()` 导致迭代器失效?

此代码将 的结果begin() const与 的结果混合在一起end()。这些函数都不允许使任何迭代器无效。但是我很好奇end()不使迭代器变量无效的要求是否begin实际上意味着该变量begin可用于end.

考虑一个 C++98,写时复制的实现std::string;非常量begin()end()函数会导致复制内部缓冲区,因为这些函数的结果可用于修改字符串。所以begin上面开始对sand都有效s2,但是使用非常量end()成员导致它不再对s2生成它的容器有效。

上面的代码使用写时复制实现(例如 libstdc++)产生“意外”结果。libstdc++不是end - begin与 相同,而是产生另一个数字s2.size()

  • 是否导致begin不再是有效的迭代器进入s2,它是从中检索的容器,构成“无效”迭代器?如果您查看对迭代器的要求,它们似乎在.end()被调用后都适用于这个迭代器,所以也许begin仍然有资格作为一个有效的迭代器,因此没有被无效?

  • 上面的代码在 C++98 中定义得很好吗?在 C++11 中,哪个禁止写时复制实现?

从我自己对规范的简要阅读来看,它似乎没有指定,因此可能无法保证begin()and的结果end()可以一起使用,即使没有混合 const 和非 const 版本。

0 投票
1 回答
95 浏览

c++ - 常规迭代器(或类似的范围/视图类)是否应该从 const_iterator 派生?

使常规迭代器(或类似的范围或视图类)从相应的 const_iterator 派生是一种好习惯吗?

这样做的动机

  • 共享代码,以及
  • 当迭代器/视图很大时,避免转换。

例如,考虑 3D 网格的视图,网格的一部分。它可能包含 1 个指针、3 个大小和 2-3 个步长,总共 384 个字节。

const 和 mutating 版本将具有许多通用功能(您可以对只读 3D 网格进行任何操作)。

上述示例的反动机是 const 视图包含一个 const 指针,因此变异视图必须执行 aconst_cast才能使用它,或者在非常量指针中添加一个包含相同地址的额外字段。