2012-03-14 101 views
0

我想一次搜索向量中的多個字符串。一次搜索多個字符串

即矢量= 「H」, 「H」 「我」 「我」 vector2 = 「H」, 「I」

,所以我想搜索矢量與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..."); 

      } 

     } 
+4

屬於上http://codereview.stackexchange.com – 2012-03-14 10:04:15

回答

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) 
+0

不,我並不需要檢查,如果超過元素上存在只需要找出是否有既存在,如果不退出循環,並預示着錯誤@RafalRawicki – CodersSC 2012-03-14 10:20:53

+0

我想我可以檢索次數設定,並檢查他們將分別等於@RafalRawicki – CodersSC 2012-03-14 10:23:02

+0

日誌消息「有些元素已經出現不止一次......」是我不清楚。無論如何,與'test.begin()'比較沒有意義。 – 2012-03-14 10:26:26

1

一個問題可能是:

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

,而不是

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

您的版本看起來test中的元素test,它將始終返回一個val id迭代器。

除此之外,當您發現string不存在時,您可以從循環中只需break,無需繼續搜索,對不對?

+0

是的,這是正確的,我有一個字符串矢量,我會填充串的另一種載體和我有檢查第一個向量**測試**包含來自** test1的字符串** @LuchianGrigore – CodersSC 2012-03-14 10:05:12

+0

@ShamariCampbell ok,那麼應該這樣做。 – 2012-03-14 10:05:55

+0

噢我的意思是把te​​st1的遺憾@LuchianGrigore – CodersSC 2012-03-14 10:06:44

1

如果你可以在兩個向量進行排序,你可以使用std::includes

+0

是的,這可能工作 – CodersSC 2012-03-14 10:24:29

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