gpt4 book ai didi

c++ - STL 中的 Binary_search set over set 的成员函数 find?

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

为什么我们有上述两种方式来搜索集合中的元素?

也可以使用查找算法来查找列表或 vector 中的元素,但是这些提供成员函数以及成员函数预期比通用算法更快的危害是什么?

为什么我们需要删除算法并创建所有关于删除删除的戏剧,其中删除只会移动元素然后使用删除删除实际元素..就像 STL 列表提供了一个成员函数删除为什么其他容器不能只是提供删除功能并完成它?

最佳答案

Binary_search in STL set over set's member function find?
Why do we have 2 ways like above to search for an element in the set?

二进制搜索返回一个 boolset::find() 和迭代器。为了将苹果与苹果进行比较,用于比较 set::find() 的算法是 std::lower_bound(),它也返回一个迭代器。

您可以在由一对(前向/双向/随机访问)迭代器指定的任意排序范围上应用std::lower_bound(),而不仅仅是在标准::设置因此 std::lower_bound() 是合理的。 由于 std::set 恰好是一个排序范围,您可以调用

std::lower_bound(mySet.begin(), mySet.end(), value);

但是

mySet.find(value);

调用不仅更简洁,也更高效。如果您查看 std::lower_bound() 的实现,您会发现类似 std::advance(__middle, __half); 的东西,它具有不同的复杂性,具体取决于迭代器(无论是前向/双向/随机访问迭代器)。在 std::set 的情况下,迭代器是双向的,推进它们具有线性复杂度,哎哟!相比之下,std::set::find() 保证以对数时间复杂度执行搜索。底层实现(在 libstdc++ 的情况下是红黑树)使之成为可能。 提供 set::find() 也是合理的,因为它比在 std 上调用 std::lower_bound() 更有效::设置

Also find algorithm can be used to find an element in a list or a vector but what would be the harm in these providing a member function as well as member functions are expected to be faster than a generic algorithm?

我看不出如何为列表或 vector 提供更快的成员函数,除非容器已排序(或拥有某些特殊属性)。

Why do we need remove algorithm and create all the drama about erase remove where remove will just shift the elements and then use erase to delete the actual element..Just like STL list provides a member function remove why cant the other containers just offer a remove function and be done with it?

我能想到两个原因。

是的,STL 严重缺乏许多方便的功能。在整个容器上使用算法时,我常常觉得自己生活在始末 hell 中;我经常证明我自己的包装器可以接受一个容器,比如:

template <typename T>
bool contains(const std::vector<T>& v, const T& elem) {

return std::find(v.begin(), v.end(), elem) != v.end();
}

这样我就可以写

if (contains(myVector, 42)) { 

代替

if (std::find(myVector.begin(), myVector.end(), 42) != myVector.end()) { 

不幸的是,您经常不得不自己动手或使用 boost。为什么?因为标准化是痛苦和缓慢的,所以标准化委员会专注于更重要的事情。委员会的人经常贡献他们的空闲时间,但他们的工作没有报酬。

现在从 vector 中删除元素可能很棘手:你关心元素的顺序吗?您的元素是 POD 吗?您的异常安全要求是什么?

假设您不关心元素的顺序并且想要删除第 i 个元素:

std::swap(myVector[i], myVector.back());
myVector.pop_back();

或者更简单:

myVector[i] = myVector.back(); // but if operator= throws during copying you might be in trouble
myVector.pop_back();

在具有移动语义的 C++11 中:

myVector[i] = std::move(myVector.back());
myVector.pop_back();

请注意,这些是 O(1) 操作而不是 O(N)这些是标准委员会留给您的效率和异常安全考虑因素的示例。提供成员函数和“一刀切”不是 C++ 方式。

说了这么多,我再说一遍,我希望我们有更多方便的功能;我明白你的问题。

关于c++ - STL 中的 Binary_search set over set 的成员函数 find?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915824/

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