一次搜索多个字符串

时间:2012-03-14 09:58:13

标签: c++ search vector find

我想一次在矢量中搜索多个字符串。

即vector =“H”“H”“我”“我”     vector2 =“H”“我”

所以我想用vector2的内容搜索向量我的代码在下面,但我不认为这是最好的方法。如果所有字符串都存在,则返回一个标识符,以便我知道所有字符串都存在。

有人可以检查下面的代码,看看它是否正确:)谢谢

std::vector<std::string> test; 
        test.push_back("YES");
        test.push_back("YES");
        test.push_back("NO");
        test.push_back("NO");

        std::vector<std::string> test1; 
        test1.push_back("YES");
        test1.push_back("NO");

        std::vector<std::string>::iterator it;
        for(int i = 0; i < test1.size(); i++)
        {



            if(find (test.begin(), test.end(),test[i]) != test.begin() )
            {
                DCS_LOG_DEBUG("Some elements have appeared more than once...");

            }

        }

5 个答案:

答案 0 :(得分:2)

比较不正确。如果要检查容器中是否至少有一个元素而不是:

if(find(test.begin(), test.end(),test[i]) != test.begin())

你应该使用:

if(find(test.begin(), test.end(),test1[i]) != test.end())

because find returns test.end()当它找不到匹配时。

如果您想检查是否存在多个元素,请使用count

if(count(test.begin(), test.end(),test1[i]) > 1)

答案 1 :(得分:1)

问题可能是:

if(find (test.begin(), test.end(),test[i]) != test.begin() )

而不是

if(find (test.begin(), test.end(),test1[i]) != test.end() )

您的版本在test内查找test的元素,它们将始终返回有效的迭代器。

除此之外,当您发现不存在的string时,您可以从循环中break,无需继续搜索,对吧?

答案 2 :(得分:1)

如果您可以对这两个向量进行排序,则可以使用std::includes

答案 3 :(得分:1)

让我添加一个不包含明确的解决方案,并假设:

  • test1中没有重复的项目。
  • 您正在寻找测试中包含的完全相同的字符串。

    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    struct StringFoundCounter 
    {
        StringFoundCounter(const vector<string>& haystack) 
            : sum(0), haystack(haystack) { }
    
        void operator()(string needle) {
            if (find(haystack.begin(), haystack.end(), needle) != haystack.end())
                sum++;
        }
    
        int get_sum() const  { return sum; }
    
    private:
        int sum;
        const vector<string>& haystack;
    };
    
    int main()
    {
        std::vector<std::string> test;
        test.push_back("YES");
        test.push_back("YES");
        test.push_back("NO");
        test.push_back("NO");
    
        std::vector<std::string> test1;
        test1.push_back("YES");
        test1.push_back("NO");
        test1.push_back("CR");
    
        StringFoundCounter sfc = 
            for_each(test1.begin(), test1.end(), StringFoundCounter(test));
    
        if (test1.size() == sfc.get_sum())
            cout << "All elements found" << endl;
        else
            cout << "Some or all elements not found" << endl;
    }
    

答案 4 :(得分:0)

我也需要类似的东西,所以写了几行对我来说效果很好。

    // allCollectableItems is a vector<string> containing all strings to be searched
    // itemsCollected is a vector<string> in which allCollectableItems are to be looked for

    bool allItemsFound = true;
    
                    for (string item : allCollectableItems)
                    {
                        if (std::find(itemsCollected.begin(), itemsCollected.end(), item) == itemsCollected.end())
                        {
                            allItemsFound = false;
                            break;
                        }
                    }

// allItemsFound will be the required value