C++ 在排序列表中进行二进制搜索,所有节点均为struct C++;
我有一个列表,其中所有元素都是表单的结构C++ 在排序列表中进行二进制搜索,所有节点均为struct C++;,c++,list,stl,binary-search,C++,List,Stl,Binary Search,我有一个列表,其中所有元素都是表单的结构 typedef struct person_node{ string name; string country; }person; std::list<person> list; 我唯一不知道的是,“如果我需要在列表中查找特定的名称,我应该输入什么来代替值?” 此外,如果找到了,我还需要一个迭代器来指向该节点。第三项描述了您正在搜索的内容,您可以调用它 比较函数(*iter,value) 或 比较函数(值,*iter) 其
typedef struct person_node{
string name;
string country;
}person;
std::list<person> list;
我唯一不知道的是,“如果我需要在列表中查找特定的名称,我应该输入什么来代替值?”
此外,如果找到了,我还需要一个迭代器来指向该节点。第三项描述了您正在搜索的内容,您可以调用它 比较函数(*iter,value) 或
比较函数(值,*iter)
其中,iter
是集合中的有效迭代器。在第一种情况下,如果列表中的*iter
必须出现在value
之前,才能保持排序,则返回true
,在第二种情况下,反之亦然
因此,请注意,如果compare\u函数
同时支持这两种重载,则实际上可以将字符串
作为第三个参数传入。原型是:
template <class ForwardIterator, class T, class Compare>
bool binary_search ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
模板
布尔二进制搜索(ForwardIterator first,ForwardIterator last,
常数T和值,比较comp);
并且T不一定是迭代器的值类型
顺便说一句,虽然您可以将它用于std::list
,但对于不是随机访问的迭代器来说,这是非常低效的,因为每个std::advance
语句都是O(N)
,因此整个操作都是O(N log N)
。即使是常规的std::find
也会更快
如果可以使用重复项,请使用vector
或multiset
,如果不允许重复项,请使用set
另外,
binary\u search
本身会返回true/false
,以确定该项目是否存在并且没有找到该项目(因此您不知道其国家/地区)。如果有重复项,可以使用std::equal_range
获取所有此类值的列表。如果您没有,您可以使用std::lower_bound
,这将为第一项提供一个迭代器,其名称等于或大于您的名称,然后检查它是否等于,而不是大于。第三项以您可以调用的方式描述您正在搜索的内容
比较函数(*iter,value)
或
比较函数(值,*iter)
其中,iter
是集合中的有效迭代器。在第一种情况下,如果列表中的*iter
必须出现在value
之前,才能保持排序,则返回true
,在第二种情况下,反之亦然
因此,请注意,如果compare\u函数
同时支持这两种重载,则实际上可以将字符串
作为第三个参数传入。原型是:
template <class ForwardIterator, class T, class Compare>
bool binary_search ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
模板
布尔二进制搜索(ForwardIterator first,ForwardIterator last,
常数T和值,比较comp);
并且T不一定是迭代器的值类型
顺便说一句,虽然您可以将它用于std::list
,但对于不是随机访问的迭代器来说,这是非常低效的,因为每个std::advance
语句都是O(N)
,因此整个操作都是O(N log N)
。即使是常规的std::find
也会更快
如果可以使用重复项,请使用vector
或multiset
,如果不允许重复项,请使用set
另外,
binary\u search
本身会返回true/false
,以确定该项目是否存在并且没有找到该项目(因此您不知道其国家/地区)。如果有重复项,可以使用std::equal_range
获取所有此类值的列表。如果您没有,您可以使用std::lower_bound
,这将为第一个项目提供一个迭代器,其名称等于或大于您的名称,然后检查它是否等于而不是大于您的名称。您输入一个人,其中包含您要查找的名称
还要注意的是,binary\u search
很少有用(它只告诉您项目是否存在,而不是它在集合中的位置。它在std::list
上毫无用处,因为它需要随机访问迭代器才能正常工作(而std::list
没有提供)
因此,您可能需要的是一个std::vector
或std::deque
,您可能需要使用std::lower_bound
或std::upper_bound
对其进行搜索,std::lower_bound
和std::upper_bound
将分别向找到的项返回一个迭代器,使您能够访问该对象输入一个人
,其中包含要查找的姓名
还要注意的是,binary\u search
很少有用(它只告诉您项目是否存在,而不是它在集合中的位置。它在std::list
上毫无用处,因为它需要随机访问迭代器才能正常工作(而std::list
没有提供)
因此,您可能需要的是一个std::vector
或std::deque
,您可能需要使用std::lower_bound
或std::upper_bound
对其进行搜索,std::lower_bound
和std::upper_bound
将分别向找到的项返回一个迭代器,使您能够访问该对象您正在搜索的值。由于您没有解释要搜索的内容,我不确定我们还能告诉您什么。您应该输入正确初始化的person\u节点;person\u节点Temp;Temp.name=“r20rock”二进制搜索(l.begin(),l.end(),Temp,comp);
列表上的二进制搜索没有什么意义(只有当键的比较与遍历列表的成本相比非常昂贵时才有意义,我对此表示怀疑)。查找拆分点的成本与列表的大小成线性关系,并且