c++ - 迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间被访问?
问题描述
我的代码如下所示:
std::unordered_set<int> ht{1,2,3};
ht.reserve(10000); // ht will not exceed this size
for(int i = 0; i < n; i++)
{
auto j = i;
for(auto it = ht.begin(); it != ht.end(); ++it)
{
// do some stuff
int v = j++;
ht.emplace(v);
}
}
对于内部循环,我想从 ht 的开头循环到结尾,但我不希望循环遍历循环中任何新添加的元素。换句话说,上面是否等同于下面?
std::unordered_set<int> ht{1,2,3};
ht.reserve(10000); // ht will not exceed this size
for(int i = 0; i < n; i++)
{
auto temp = ht;
auto j = i;
for(auto it = ht.begin(); it != ht.end(); ++it)
{
// do some stuff
auto v = j++;
temp.emplace(j);
}
ht = temp;
}
基于我所做的一些运行,它似乎是等效的,但我不知道这是否是未定义的行为,或者它们是否确实是等效的。如果将unordered_set
更改为 a vector
,这将不起作用,但似乎前向迭代器工作。
ht.reserve(10000); // ht will not exceed this size
如果不存在或实际上超过了保留容量,答案是否会改变ht
,因此所有前向迭代器都将失效?
解决方案
不,这不安全:
在大多数情况下,容器中的所有迭代器在插入后仍然有效。唯一的例外是当容器的增长迫使重新散列时。在这种情况下,容器中的所有迭代器都将失效。
有时它有效,但我认为这对你来说还不够!
推荐阅读
- ruby-on-rails - Rails 在 iOS 上使用 Safari 和 Mobile Safari 设计 Omniauth 问题
- android - 我正在尝试使用编辑文本 id,但它显示错误,你能帮帮我吗
- java - 如何在 JFrames 中使用 2 类绘制通过 Netbeans 中的 Palette 生成代码?
- apache - 切换到 Cloudflare DNS 会触发此错误“Unsupported X-Forwarded-Proto: https, https for URL” with mod_pagespeed 1.11.33.5-0 @26313
- python - 如何获取祖先标签相对于已故孩子的 href 属性
使用 Selenium 和 Python 进行标记
我正在尝试获取一个
<a>
元素,以防其嵌套(内部)<h3>
标签包含特定文本。我该怎么做?假设结构如下:<a href="https://example.com"> <section class="section">
- delta-lake - databricks delta Lake 文件扩展名是镶木地板
- swift - 选择排序算法的 Swift 比 Flutter 慢
- python-3.x - Shareplum : ConnectionResetError: [WinError 10054] 现有连接被远程主机强行关闭
- python - 如何按多列分组
- file - this.$refs.selectedImages.files.map 不是函数 - vue electron