gpt4 book ai didi

c++ - 一个多索引,其中一个索引是整个集合的一个子集

转载 作者:行者123 更新时间:2023-11-30 04:28:21 24 4
gpt4 key购买 nike

我想用两个 sequenced View 构建一个多索引,其中我只能从一个 View 中删除值。

在代码中:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/sequenced_index.hpp>

#include <algorithm>
#include <iterator>
#include <vector>

using namespace boost::multi_index;

typedef multi_index_container<
int,
indexed_by<
sequenced<>,
sequenced<>
>
> container;

int main()
{
container c;
std::vector<int>
// complete
data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
// only uneven
uneven_data;
std::copy_if(begin(data), end(data),
std::back_inserter(uneven_data),
[](int i) { return i % 2 != 0; });

container cont;
std::copy(begin(data), end(data), std::back_inserter(cont));

auto& idx0 = cont.get<0>();
auto& idx1 = cont.get<1>();
// remove all uneven from idx1
idx1.remove_if([](int i) { return i % 2 == 0; });

// behavior I would like to be true, but now both idx0 and idx1 are
// equal to uneven_data
assert(std::equal(begin(data), end(data), begin(idx0)));
assert(std::equal(begin(uneven_data), end(uneven_data), begin(idx1)));

return 0;
}

boost::multi_index 可以实现这样的功能吗?

最佳答案

没有。在 boost multi_index_container 中,索引作为相同值的单独 View 耦合在一起。这是boost multi_index_containers的重要保证。

"Boost.MultiIndex allows for the specification of multi_index_containers comprised of one or more indices with different interfaces to the same collection of elements" (boost multi_index tutorial).

使用两个不同的有序<>索引,您可以用两种不同的方式重新排列顺序,但它们都必须包含所有值。

如果您希望根据 bool 谓词查看元素子集(例如:值是奇数),请考虑使用 boost::filter_iterator .这不会尝试删除容器中的值,而是在迭代期间跳过它们。

或者,选择/过滤可以通过排序获得,使用 multi_index ordered_non_unique使用适当的索引 key extractor .

例如,一个基于 key extractor 的 ordered_non_unique 索引: [](int i) { return i % 2; 会将奇数和偶数放在不同的组中,因此可以使用 equal_range 获得所有奇数的迭代器范围.

关于c++ - 一个多索引,其中一个索引是整个集合的一个子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217601/

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