- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么我们有上述两种方式来搜索集合中的元素?
也可以使用查找算法来查找列表或 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?
二进制搜索返回一个 bool
和 set::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/
我有一个自定义类和 std::vector 填充了此类的对象。我想在此数组中执行 binary_search。 我像这样在我的类中重载了运算符: bool operator ==(const some
我想用指针实现binary_search #include #include using namespace std; int binary_p(int x[],int size,int targ
我希望这不是痛苦的显而易见。我收到此神秘错误: fold.cpp:92: error: expected primary-expression before ‘)’ token 它所指的行是: if
我有一个 vector v 类 X 的实例 class X { public: int attribute_1; ... operator==(const int i){return th
我被这个问题困住了,我正在处理位置 vector 。在一种情况下,该 vector 相对于偶“位置”的第一个分量排序,在另一种情况下相对于另一个分量排序,在这两种情况下,偶的另一个元素保持不变。所以例
这段代码有什么问题吗? bool Spellcheck::smart_comp(string value, string key){ return true; } void func(){
全部,我有这样的代码: bool ISearchable::PerformSearch(const vector &passList, const string &lname, const strin
我正在阅读有关 binary_search 的内容,然后我尝试使用谓词来实现它。这是我的代码(我还包括了我正在使用的排序谓词)。我知道小于是默认值。这是粗略的测试代码 class person { p
我目前正在考虑使用 std::binary_search()(来自库)来确定列表中是否存在某个实例。在我开始使用它之前,我想知道它是如何工作的。 我的理解是它使用比较(对于用户定义的结构/类,它需要访
我尝试制作一个程序,使用 std::binary_search 检查数字是否在向量中 我知道我可以使用 std::find , 但我听说 std::binary_search如果比 std::find
我有一个按其整数索引排序的类对象 vector 。但是对象的索引是由类的成员函数生成的 - 因此没有 int id 存储为成员变量。 class boundary { public:
我有一些数据存储在排序的 vector 中。该 vector 按某个键排序。我知道 STL 有一个算法来检查一个元素是否在这个排序列表中。这意味着我可以这样写: struct MyData { int
我在这里找到了很多关于该主题的答案,但我无法运行我的代码。 编辑:发布的示例现在可以在引入缺失的东西后使用。希望有人可以使用这个例子作为自己实验的基础。我还介绍了将此示例用作随机访问迭代器所缺少的东西
这个问题在这里已经有了答案: Where can I get a "useful" C++ binary search algorithm? (9 个回答) 关闭5年前。 我想在 binary-sea
binary_search() 函数定义在头文件中,用于查找指定区域内是否包含某个目标元素。 该函数有 2 种语法格式,分别为: //查找 [first, last) 区域内是否包含 val boo
thrust::binary_search 据我所知,除默认流外的所有段错误。我在文档中找不到任何描述这种限制的信息,所以我希望专家能启发我如何正确使用。 这是一个简单的例子。此测试代码创建一个未排序
在下面的程序中,binary_search 返回 Err(2) 而不是预期的 Ok(0)。这是错误吗? fn main() { let x = vec!["slot", "s"]; l
std::find_if 在其重载函数之一中采用谓词。绑定(bind)器使得为用户定义的类型编写 EqualityComparators 并将它们用于动态比较或静态比较成为可能。 相比之下,标准库的二
std::binary_search 击败了一个简单的自制二进制搜索算法(再次): // gcc version 4.8.2 X86_64 #ifndef EXAMPLE_COMPARE_VERSIO
在我检测到 std::upper_bound 之前,我实现了我自己的 binarySearch 版本来确定所需元素的索引。该实现有效,但与线性搜索相比,我的 binarySearch 只快了一点点。随
我是一名优秀的程序员,十分优秀!