Поиск нескольких строк одновременно - PullRequest
0 голосов
/ 14 марта 2012

Я хочу найти несколько строк в векторе.

т.е. вектор = "H" "H" "I" "I" vector2 = "H" "I"

, поэтому я хочу найти вектор с содержимым вектора2, мой код приведен ниже, но я не думаю, что это лучший способ. Если присутствуют все строки, возвращайте идентификатор, чтобы я знал, что все строки присутствуют.

Может кто-нибудь проверить приведенный ниже код, чтобы убедиться, что он правильный :) Спасибо

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...");

            }

        }

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

Сравнение неверно. Если вы хотите проверить, есть ли в контейнере хотя бы один элемент вместо:

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

вы должны использовать:

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

, поскольку find возвращает test.end(), когда не найдено совпадений.

Если вы хотите проверить, существует ли более одного элемента , используйте count:

if(count(test.begin(), test.end(),test1[i]) > 1)
1 голос
/ 14 марта 2012

Позвольте мне добавить решение, которое не содержит явного для, и предположим, что:

  • В тесте 1 нет повторяющихся элементов.
  • Вы ищете точно такую ​​же строку, которая будет содержаться в тесте.

    #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;
    }
    

    ~

1 голос
/ 14 марта 2012

Если вы можете отсортировать два вектора, вы можете использовать std::includes.

1 голос
/ 14 марта 2012

Проблема может быть:

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

вместо

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

Ваша версия ищет элементы test внутри test, которые всегда будут возвращать действительный итератор.

Кроме этого, когда вы найдете string, которого нет, вы можете просто break из цикла, не нужно продолжать поиск, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...