C++ 在vector中查找特定字符串的最佳方法是什么?

C++ 在vector中查找特定字符串的最佳方法是什么?,c++,string,stl,vector,C++,String,Stl,Vector,比如说。我有一些结构: s_Some{ std::string lable; s_some_junk some_junk; }; 和一个向量: std::vector<s_Some> mSome; std::vector mSome; 然后我用很多s_-Somes填充这个向量 我需要在这个向量中找到一个迭代器,它有一个特定的标签。到目前为止,我只是重复了所有这些垃圾,并将每个标签与想要的标签进行匹配。我觉得这有点愚蠢。有更好的方法吗?如果你只想搜索几次,或者如果你的向量

比如说。我有一些结构:

s_Some{
  std::string lable;
  s_some_junk some_junk;
};
和一个向量:

std::vector<s_Some> mSome;
std::vector mSome;
然后我用很多s_-Somes填充这个向量


我需要在这个向量中找到一个迭代器,它有一个特定的标签。到目前为止,我只是重复了所有这些垃圾,并将每个标签与想要的标签进行匹配。我觉得这有点愚蠢。有更好的方法吗?

如果你只想搜索几次,或者如果你的向量每次搜索都可能有不同的内容,很遗憾,没有其他选择;你必须遍历整个向量

但是,如果向量创建后不会更改,并且必须运行大量搜索,请执行以下操作:

  • 按字符串的升序对向量排序(即它们在字典中的排列方式)
  • 这样排序后,将用于所有搜索 这会快得多。

    您也可以使用选项1) 如果您被迫使用std::vector,但一旦填充了该向量,它就保持不变,那么您可以对该向量进行排序并使用二进制搜索。唯一的成本将是排序,然后将不会有额外的开销。搜索时间是对数O(logN)

    备选方案2) 如果你有自由,可以选择不同的数据结构,那么考虑使用地图(也对数)或无序的地图(预期的O(1),最坏的O(n))。
    我刚刚注意到,您说您希望将每个标签与正在查找的标签进行匹配。所以我的结论是你可以有重复的标签。然后,对于第2点,使用相应的多映射容器,而对于第1点,事情会变得更混乱。

    您可以找到执行此操作的算法。定义一个谓词,如下所示:

    struct isEqual
    {
        isEqual(const std::string& s): m_s(s)
        {}
        bool operator()(S_Some& l)
        {
            return l.lable == m_s;
        }
    
        std::string m_s;
    };
    
    在搜索时,您可以使用

    std::vector<S_Some>::iterator iter = std::find_if(mSome.begin(),
                                                      mSome.end(),
                                                      isEqual(std::string("AAAA"));
    
    std::vector::iterator iter=std::find_if(mSome.begin(),
    mSome.end(),
    isEqual(标准::字符串(“AAAA”);
    
    使用

    std::multimap< string, s_Some > mSome;
    
    找到所需标签值的第一个实例

    mSome.find( lable_you_want );
    
    下一个实例将通过递增迭代器找到

    比照


    也就是说,除非您需要使用std::vector。

    但这只是编写for循环的一种更好的方法。复杂性仍然是线性的,没有任何改进。STL find_if将只从开始到匹配/结束遍历向量。是的,我想(从问题标题)他希望避免自己写循环。可能我没有正确理解这个问题,我认为我们必须使用vectorRight,两种解释似乎都是合理的;)现在,当我从性能角度再次阅读时,我看到了这样一句话:“这在我看来有点愚蠢。有更好的方法吗?”以完全不同的方式。。
    mSome.find( lable_you_want );