- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试进行 binary_search,包括一个整数对 vector 和一个整数,如下所示:
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<pair<size_t,size_t> > int_pairs;
bool operator<(const size_t& l, const pair<size_t,size_t>& r)
{return r.first < l;} // useful for binary search
int main(){
int_pairs pairs_vec;
pairs_vec.push_back(pair <size_t,size_t>(1,2));
pairs_vec.push_back(pair <size_t,size_t>(2,2));
size_t i(2);
binary_search(pairs_vec.begin(),pairs_vec.end(),i);
}
编译器告诉我 operator<
未定义:
erreur: no match for ‘operator<’ (operand types are ‘const long unsigned int’ and ‘std::pair<long unsigned int, long unsigned int>’)
我的做法是否正确?我尝试以多种不同方式更改运算符的定义,但似乎没有任何效果。
最佳答案
这不起作用的原因是 operator<
未从您调用的点查找 binary_search
,而是稍后从它的 body 内部 - 那是在命名空间内 std
.
自 std::pair
已经定义了 relational operators在命名空间 std
,它们将您的重载隐藏在全局范围内,并且永远不会通过名称查找找到。
解决方案是不使用 operator<
根本。创建你自己的不与任何东西冲突的比较器类,重载它的 operator()
,并使用 binary_search
的另一个重载让您指定自定义比较器。像这样:
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<size_t, size_t> my_pair;
typedef vector<pair<size_t,size_t> > int_pairs;
struct Comp {
// important: we need two overloads, because the comparison
// needs to be done both ways to check for equality
bool operator()(my_pair p, size_t s) const
{ return p.first < s; }
bool operator()(size_t s, my_pair p) const
{ return s < p.first; }
};
int main(){
int_pairs pairs_vec;
pairs_vec.push_back(pair <size_t,size_t>(1,2));
pairs_vec.push_back(pair <size_t,size_t>(2,2));
size_t i(2);
binary_search(pairs_vec.begin(),pairs_vec.end(),i, Comp());
}
旁注:
您对 operator<
的尝试错了,因为你在函数内切换了操作数的顺序。严格弱排序比较器的契约规定,如果第一个操作数出现在第二个操作数之前,它必须返回真(这适用于整个标准库中的所有比较函数)。
bool operator<(const size_t& l, const pair<size_t,size_t>& r)
{
return r.first < l; // Wrong!
}
正如上面评论中所说,如果用于比较的操作数是不同类型的,则需要两个重载。检查与 <
是否相等,你需要两个测试:
(!(a < b) && (!b < a))
关于c++ - binary_search 与 std::pair 使用自定义运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406479/
我有一个自定义类和 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 只快了一点点。随
我是一名优秀的程序员,十分优秀!