gpt4 book ai didi

c++ - STL 关联容器 : erasing and getting back the (noncopyable) element

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:45 24 4
gpt4 key购买 nike

我正在使用 STL 关联容器(std::setstd::map),其中包含一个 std::unique_ptr<> 键。实例。键定义等效于以下内容:

struct Key
{
std::unique_ptr<Object> object;
bool operator== (const Key& rhs) const { return object->equal (*rhs.object); }
bool operator< (const Key& rhs) const { return object->less (*rhs.object); }
}

众所周知,STL 关联容器(尤其是自 C++11 起)无法获取对要移动的键的非常量引用。我的 key 是不可复制的,所以 c++: Remove element from container and get it back不起作用。

有没有非 UB 的方法来克服这个问题?

我目前的解决方案如下:

template <typename T>
using map_pair_type = std::pair<typename T::key_type, typename T::mapped_type>;

template <typename T>
typename T::value_type take_set (T& container, typename T::iterator iterator)
{
typename T::value_type result = std::move (const_cast<typename T::value_type&> (*iterator));
container.erase (iterator);
return result;
}

template <typename T>
map_pair_type<T> take_map (T& container, typename T::iterator iterator)
{
map_pair_type<T> result {
std::move (const_cast<typename T::key_type&> (iterator->first)),
std::move (iterator->second)
};
container.erase (iterator);
return result;
}

最佳答案

这是其中之一:

Really sorry. We tried to make this work and couldn't get it through committee.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3645.pdf

据我所知,您的解决方案是最好的。您的 map 解决方案确实表现出未定义的行为。如果第二步抛出异常,它将变得非常糟糕。除此之外,我怀疑它会起作用。而且我怀疑我会因为这样说而被否决。

UB 的原因是键被定义为 const(而不是仅仅被 const 引用引用)。在这种情况下丢弃 const(并让移动构造函数修改对象)是 UB。

如果 N3586 被接受,您可以:

move_only_type mot = move(*s.remove(s.begin()));

或:

move_only_key mok = move(m.remove(m.begin())->first);

N3586/N3645在组委会中表现出色。它经过讨论并通过了工作组阶段,只是在全体委员会中被否决了。问题是 std::lib 必须提交 UB 才能实现它。尚未重新提交。

更新

现在可以在 C++17 中执行此操作,但成员函数称为 extract 而不是 remove

关于c++ - STL 关联容器 : erasing and getting back the (noncopyable) element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671303/

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