gpt4 book ai didi

c++ - 在 vector 中重载 push_back() 以允许非重复元素

转载 作者:行者123 更新时间:2023-11-30 02:14:40 25 4
gpt4 key购买 nike

我们能否重载 std::vector 中的 push_back() 方法以允许非重复元素?我知道 std::setstd::unordered_set 应该避免重复元素,但是 std::set 对元素进行排序并且 std::unordered_set 以无特定顺序存储元素。我需要按插入顺序检索元素,同时确保不插入重复元素。

编辑:这个问题可能重复here .这个重复的最佳解决方案建议有一个辅助数据结构和另一个自定义方法“添加”。这对我来说不太好,因为(我将把它放在单独的文档中)在 std::vector 中插入数据的用户很少引用任何自定义函数的文档。如果没有有效的方法,这可能是最后的手段。

最佳答案

许多人反对它,但似乎流传着某种都市传说,这样做会导致宇宙经历真空衰变,而我们所知道的现实将会消散。

您可以公开继承std::vector。但是您必须考虑可以用它做什么。

如果您继承vector,强烈建议您不要向它添加任何数据成员。这可能会导致对象切片(谷歌“c++ 对象切片”。)您还需要记住 vector 没有使用虚函数。这意味着您不能覆盖成员函数。您只能隐藏它们,因此不能保证它始终是您的 push_back() 函数被调用。例如,如果您将类的对象传递给引用 vector 的对象,将调用原始对象。

所以最后,您需要添加一个 push_back_unique() 函数。但这反过来意味着可以通过一个简单的免费功能来提供服务。所以不需要继承 vector 。这当然意味着永远不能保证 vector 中的元素是唯一的。其他代码可能会在某处使用 push_back()

如果您想添加全新的便利功能,而不强加或取消 vector 具有的任何限制,那么继承 vector 是有意义的。如果你想要一些看起来像 vector 但实际上不是的东西(因为它有不同的行为和/或限制),你应该实现你自己的类型,将容器功能委托(delegate)给 vector 通过从它私有(private)继承,或将其作为私有(private)数据成员,然后通过公共(public)包装函数复制 vector API。

但这实现起来非常繁琐。通常,您并不真的需要 vector 中的所有 API。所以我想说的是围绕 vector 编写一个更小的类,它只提供你需要的功能。而且该功能听起来几乎是只读的,因为允许对元素进行写访问允许将一个元素设置为与另一个元素相同的值,从而破坏容器的唯一性。所以你可以这样做:

template<typename T>
class UniqueVector
{
public:
void push_back(T&& elem)
{
if (std::find(vec_.begin(), vec_.end(), elem) == vec_.end()) {
vec_.push_back(std::forward(elem));
}
}

const T& operator[](size_t index) const
{
return vec_[index];
}

auto begin() const
{
return vec_.cbegin();
}

auto end() const
{
return vec_.cend();
}

private:
std::vector<T> vec_;
};

如果您仍然希望允许对单个元素进行写访问,那么您可以提供非常量函数来检查传递的值是否已经在 vector 中。喜欢:

void assign_if_unique(size_t index, T&& value)
{
if (std::find(vec_.begin(), vec_.end(), value) == vec_.end()) {
vec_[index] = std::forward(value);
}
}

这是一个最小的例子。您显然应该添加您真正想要的功能。如 size()empty() 以及您需要的任何其他内容。

关于c++ - 在 vector 中重载 push_back() 以允许非重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57372915/

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