列表中的find()
函数是否存在于向量中?
有没有办法在列表中执行此操作?
答案 0 :(得分:86)
您使用<algorithm>
中的std::find
,这对std::list
和std::vector
同样有效。 std::vector
没有自己的搜索/查找功能。
#include <list>
#include <algorithm>
int main()
{
std::list<int> ilist;
ilist.push_back(1);
ilist.push_back(2);
ilist.push_back(3);
std::list<int>::iterator findIter = std::find(ilist.begin(), ilist.end(), 1);
}
请注意,默认情况下,这适用于int
等内置类型以及std::string
等标准库类型,因为它们为operator==
提供了std::find
。如果您在用户定义类型的容器上使用operator==
,则应重载std::find
以允许{{1}}正常工作:EqualityComparable
concept
答案 1 :(得分:17)
不,不是直接在std :: list模板本身。但是你可以使用std :: find算法:
std::list<int> my_list;
//...
int some_value = 12;
std::list<int>::iterator iter = std::find (my_list.begin(), my_list.end(), some_value);
// now variable iter either represents valid iterator pointing to the found element,
// or it will be equal to my_list.end()
答案 2 :(得分:7)
除了使用std :: find(来自算法),您还可以使用std::find_if(比IMd更好,然后是std :: find),或this list
中的其他查找算法#include <list>
#include <algorithm>
#include <iostream>
int main()
{
std::list<int> myList{ 5, 19, 34, 3, 33 };
auto it = std::find_if( std::begin( myList ),
std::end( myList ),
[&]( const int v ){ return 0 == ( v % 17 ); } );
if ( myList.end() == it )
{
std::cout << "item not found" << std::endl;
}
else
{
const int pos = std::distance( myList.begin(), it ) + 1;
std::cout << "item divisible by 17 found at position " << pos << std::endl;
}
}
答案 3 :(得分:3)
你能做什么以及你应该做些什么是不同的事情。
如果列表很短,或者您只打算调用一次,那么请使用上面的线性方法。
然而,线性搜索是我在慢速代码中发现的最大的罪恶之一,并考虑使用有序集合(如果允许重复,则使用set或multiset)。如果由于其他原因需要保留列表,例如使用LRU技术或者需要维护插入顺序或其他顺序,请为其创建索引。你实际上可以使用列表迭代器(或多集)的std :: set来做到这一点,尽管你需要在修改列表的任何时候保持这个。
答案 4 :(得分:0)
是的,列表STL中存在find()方法。 只需使用
std :: list < int > l;
std :: list < int > :: iterator pos;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
l.push_back(6);
int elem = 3;
pos = find(l.begin() , l.end() , elem);
if(pos != l.end() )
std :: cout << "Element is present. "<<std :: endl;
else
std :: cout << "Element is not present. "<<std :: endl;