如何在stl列表中搜索元素?

时间:2011-01-05 12:49:30

标签: c++ stl

列表中的find()函数是否存在于向量中?

有没有办法在列表中执行此操作?

5 个答案:

答案 0 :(得分:86)

您使用<algorithm>中的std::find,这对std::liststd::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;