问题标签 [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 投票
1 回答
335 浏览

c++ - 在 C++17 中,为什么关联容器有一个接受(非 `const`)`iterator` 的`erase` 成员函数?

参见,例如, http ://en.cppreference.com/w/cpp/container/map/erase

在 C++03 中有三个重载:

在 C++11 中,第一个和第二个重载被更改为 takeconst_iterator以便可以使用iterator或调用它们const_iterator。第一个重载也得到了改进,它在删除迭代器后将迭代器返回到元素:

在 C++17 中,重新引入了非常量重载:

为什么需要这个?没有为 ranged eraseinsert、 或任何序列容器(例如vectordeque和 )添加它list

0 投票
1 回答
185 浏览

c++ - 自定义迭代器的 cbegin 没有被使用

我在地图的键上定义了两个迭代器:

以下类型使用这些迭代器:

以下不编译:

g++ 5.4.0 的错误消息显示begin使用的是cbegin. 为什么?

0 投票
3 回答
262 浏览

c++ - 有 make_const_iterator 吗?

有时我会想使用算法库中函数返回的迭代器。当我在修改函数和非修改函数之间切换时,就会出现我面临的问题。因为在非修改函数中我想使用const_iterator. 作为一个玩具示例:

当我尝试编译此代码时,出现错误:

没有匹配的调用函数find(std::vector<int>::const_iterator, __gnu_cxx::__normal_iterator<int*, std::vector<int> >&, int)

我遇到的问题是我能找到的唯一转换过程可能很昂贵:auto cit = next(cbegin(v), distance(begin(v), it))

有没有办法让这个工作?或者我是卡住转换还是只使用非const_iterators?

0 投票
1 回答
651 浏览

c++ - 如何散列 std::unordered_map::const_iterator?

你还记得我之前的问题:是什么导致了std::async这里的数据竞争?
即使我成功地并行化了这个程序,它仍然运行得太慢而不实用。
所以我试图改进代表康威生命游戏模式的数据结构。
新结构的简要说明:

简而言之,pattern包含单元格。它包含每个 ON 单元,以及每个具有 1 个或多个 ON 相邻单元的 OFF 单元。它还可以包含备用的 OFF 单元。
cells_coor通过使用它们的坐标作为键直接存储单元格,并将它们映射到它们的 ON 相邻单元格的数量(存储为int)以及它们是否为 ON(存储为bool)。

cells_neighcells_onoff通过迭代器将单元格间接存储为键。
一个单元的 ON 邻居数总是 0 或更大且 8 或更少,cells_neigh大小为 9 的数组也是如此。
cells_neigh[0]存储相邻单元格为 0 的单元格,cells_neigh[1]存储相邻单元格为 1 的单元格,依此类推。
同样,一个单元格总是关闭或打开,cells_onoff大小为 2 的数组也是如此。
cells_onoff[false]存储OFF单元,并cells_onoff[true]存储ON单元。
单元格必须插入或删除所有cells_coor,cells_neighcells_onoff。换句话说,如果一个单元格被插入其中一个或从其中一个中删除,那么其他的也必须如此。正因为如此,元素cells_neighcells_onoffstd::unordered_set将迭代器存储到实际单元中,从而通过邻居计数或关闭/开启状态快速访问单元。

如果这种结构有效,则插入函数的平均时间复杂度为O(1),擦除也O(1)为 ,生成O(cells_coor.size())时间为 ,与之前的结构相比,时间复杂度有很大的提高。

但是如您所见,有一个问题:我如何散列 a std::unordered_map::const_iterator
std::hash禁止对他们进行专业化,所以我必须定制一个。
获取他们的地址是行不通的,因为它们通常是作为右值或临时值获得的。
取消引用它们也不起作用,因为有多个单元格的相邻单元格为 0,或者多个单元格关闭,等等。
那我该怎么办?如果我不能做任何事情,cells_neigh并且cells_onoff将会std::vector或某事,会急剧降低时间复杂度。

0 投票
1 回答
503 浏览

c++ - 收到有关 _Vector_const_iterator 无法转换为 _Vector_iterator 的错误

我目前是 C++ 编程的新手,我正在尝试制作一个数独求解器。但是,我无法使用返回单元格候选列表的方法(单元格可能值的列表)。候选列表是一个向量。这就是我目前尝试这样做的方式,但是它出现了一个错误:

这就是它在头文件中的声明方式:

错误似乎在 m_candidateList.begin 上,错误说:

严重性代码描述项目文件行抑制状态错误(活动)不存在从“std::_Vector_const_iterator>>”到“std::_Vector_iterator>>”的合适的用户定义转换

0 投票
1 回答
663 浏览

c++ - 什么时候将 const_iterator 声明为 const 迭代器就足够了?

例如,我可以以类似于以下方式定义容器:

但是,可以使用用户定义的迭代器来执行此操作吗?

详细的解释将不胜感激。

0 投票
3 回答
1103 浏览

c++ - 在 const 迭代器上调用成员函数

我有两个类,一个Measurement包含 a的类vector<double>和一个Experiment包含 a 的类vector<Measurement>

简而言之,我试图遍历(外循环)中MeasurementExperiment每个,然后遍历每个Measurement(内循环)中的数据。

我在这个线程上找到了一些帮助,这就是为什么成员函数getDataSet()getMeasurements()const &(使迭代器兼容)。

但是,当我尝试打电话时iter_meas->getDataSet(),我遇到了麻烦。

我知道它iter_meas代表 a const Measurement,但我不确定为什么我不能Measurement::在它上面调用成员函数?

我正在使用 Visual Studio 社区 2015。

0 投票
0 回答
39 浏览

c++ - stl向量迭代器内部实现

迭代器如何跟上不断变化的 std::vector 位置。我知道每当一个新元素被添加到一个完整的向量中时,它都会分配 2 倍的新内存并将所有元素复制到该位置。之后,它会删除旧副本并添加新元素。但是迭代器如何知道向量的新地址是什么?它如何自我更新?我想知道迭代器工作的内存实现。

0 投票
2 回答
1293 浏览

c++ - const_iterator:嵌套类还是友元类?

我在为这个SparseGraph类制作这个 const_iterator 时遇到了一些严重的问题

SparseGraph 类:

出于本文的意图和目的,aSparseGraph可以被视为边缘列表(或向量的向量)的列表(这通常称为邻接列表)。然后const_iterator遍历列表列表中的每条边。

考虑:

const_iterator 的初始尝试(嵌套类)

正如人们可能注意到的那样,这operator++()给了我“非静态参考”错误:

错误:非静态数据成员“SparseGraph::m_adj_list”的使用无效

从:


const_iterator 的初始尝试(朋友类)

现在我们有一些类似的东西:

然后给了我错误

错误:“const_iterator”没有命名类型

为了

错误:在“SparseGraph::const_iterator”之前需要“typename”,因为“SparseGraph”是一个依赖范围

为了

然后更改为

错误:没有在类“SparseGraph”中声明的“typename SparseGraph::const_iterator SparseGraph::begin() const”成员函数

当我添加该类型名时。我怀疑如果我解决了第一个错误,这将得到解决,但是我不知道问题出在哪里。此外,friend 类现在正在污染包含它的任何翻译单元的范围。

我当前的代码

我的问题是,我应该怎么做?我应该使用嵌套的 const_iterator 类还是朋友的 const_iterator 类,或者,哪种方式是标准的?我应该如何实现 const_iterator 以避免这些问题?总的来说,我正在寻找一个双向 const_iterator,它将遍历 AdjacencyList(列表列表)中的每个 Edge,而不允许更改所述 AdjacencyList。

我查看了该站点上与“const_pointer implementation”相关的其他帖子,甚至提到了 Stroustrup 的“The C++ Programming Language”,但到目前为止,我还没有深入了解如何正确实现与此类似的 const_iterator。

我对如何正确地解决这个问题一点也不满意,所以对任何事情(可能与手头的主要问题无关)的任何帮助都将不胜感激。

0 投票
2 回答
66 浏览

c++ - InputIterator 和 OutputIterator 的 `operator*` 返回值的 constness 规则是什么?

我正在为自定义容器定义迭代器。迭代器实现了 InputIterator 和 OutputIterator 概念。

iterator::reference和应该使用什么类型const_iterator::referenceoperator*foriterator和应该返回什么const iterator类型const_iterator

在这种iterator情况下,是否应该有两个定义operator*?如下(T是包含的值类型):

或者只有一个:

换句话说,是否const iterator允许对底层容器进行可变访问?

对于这种const_iterator情况,我是否正确猜测以下内容是正确的?

还是应该const_iterator::reference没有T&的定义const

除了完整的答案之外,我还希望能参考权威来源,以便将来可以查找类似信息。