Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在排序列表中进行二进制搜索,所有节点均为struct C++;_C++_List_Stl_Binary Search - Fatal编程技术网

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);
列表上的二进制搜索没有什么意义(只有当键的比较与遍历列表的成本相比非常昂贵时才有意义,我对此表示怀疑)。查找拆分点的成本与列表的大小成线性关系,并且