gpt4 book ai didi

c++ - 如何在 std::unordered_set 上使用 boost::range::adaptors::transformed?

转载 作者:行者123 更新时间:2023-11-30 05:09:09 27 4
gpt4 key购买 nike

我正在尝试在 std::unordered_set 上使用 boost::adaptors::transformed,但即使在相当小的实验中似乎也会产生奇怪的行为。

我在带有 gcc 5.4.0 的 Ubuntu 16.04 上使用 Boost 1.58.0。

在迭代范围时不列出范围初始化后添加的元素:

#include <iostream>
#include <vector>
#include <unordered_set>
#include <boost/range/adaptor/transformed.hpp>

struct double_int
{
typedef int result_type;
int operator()(int x) const { return x * 2; }
};

int main()
{
std::unordered_set<int> set;

for(int i = 0; i < 5; ++i)
set.insert(i); //adding ints to set

auto range = set | boost::adaptors::transformed(double_int());

set.insert(10); //adding some other int

//this produces: '8 0 2 4 6'
for(auto i : range)
std::cout << i << std::endl;

//this produces: '10 4 0 1 2 3'
for(auto i : set)
std::cout << i << std::endl;

//element 10 is not doubled!

return 0;
}

按照与其他 std 容器(如 std::list)相同的方案按预期工作,将后者添加的元素加倍。

如果使用以下方式初始化集合,则更奇怪:

std::unordered_set<int> set = {0,1,2,3,4,5};

范围迭代只给出 '10' 而容器的 '10 0 1 2 3 4 5'

有人能告诉我这个例子有什么问题吗?

最佳答案

transformed 不会将对范围的引用存储为范围;它在 the range adaptor's construction 时获取范围的 begin/end 迭代器.

当您稍后在构建适配器后插入到集合中时,新元素可能不在插入之前由旧 begin/end 迭代器分隔的范围内。或者,更糟糕的是,如果插入会触发重新散列,则插入将使所有迭代器失效。

关于c++ - 如何在 std::unordered_set 上使用 boost::range::adaptors::transformed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com