2010-10-24 139 views
0

我試圖找到與CString的std向量進行比較的最有效,最優化和最快速的方法。有問題的字符串區分大小寫。我曾嘗試使用==運算符作爲向量容器,但是這有時會返回誤報。例如,如果一個向量包含順序(a,b,c)中的元素,而另一個向量(b,c,a)包含它們,則==運算符即使認爲它們共享相同的數據也將返回false。另一件事是它不做區分大小寫的比較。什麼是比較CString的兩個向量的最佳方法

我曾想過使用基本嵌套循環的辦法是這樣的:

//Not Tested 

BOOL bMatch = TRUE; 
for(int i=0; i<Vec1.size();i++) 
{ 
    if(!bMatch) 
    break; 
    int nComp=0; 
    for(int j=0;j<Vec2.size();j++) 
    { 
    if(vec1[i].CompareNoCase(Vec2[j])==0) 
     { 
      //We have a match--check next item 
      break; 
     } 
    else 
     { 
      nComp++; 
      if(nComp == Vec2.size()-1) 
      { 
       //Reached end of vector and no match found 
       //Vectors don't match 
       bMatch=FALSE; 
      } 
     } 

    } 
} 

上面的代碼沒有進行測試,我不知道是否有可能是一個更好的方式來實現,而不需要這樣的比較使用嵌套循環。

希望任何建議或幫助......

+1

請定義「CString的兩個向量」 - 它是'vector ','vector ','vector >'還是別的?也許簡單的'串'? – 2010-10-24 13:42:55

+1

@Tim:'CString'大概是MFC字符串類。 – 2010-10-24 13:51:07

+0

我認爲它的自我解釋...但只是爲了很好它的向量 2010-10-24 13:52:58

回答

5

如果一個向量包含順序爲(a,b,c)的元素,而另一個向量的順序是(b,c,a),==運算符即使認爲它們共享相同的數據也會返回false 。

只需將數據插入到兩個容器,其中順序並不重要,比較這些:

std::vector<CString> vec1; 
std::vector<CString> vec2; 

// ... 

std::multiset<CString> set1(vec1.begin(), vec1.end()); 
std::multiset<CString> set2(vec2.begin(), vec2.end()); 

bool equal_data = (set1 == set2); 

如果你想忽略的情況下(這在你的問題的代碼似乎暗示),你可以參數std::multisetstd::equal與適當的比較:

struct compareNoCase 
{ 
    bool operator()(const CString& a, const CString& b) 
    { 
     return a.CompareNoCase(b); 
    } 
}; 

std::vector<CString> vec1; 
std::vector<CString> vec2; 

// ... 

std::multiset<CString> set1(vec1.begin(), vec1.end(), compareNoCase()); 
std::multiset<CString> set2(vec2.begin(), vec2.end(), compareNoCase()); 

bool equal_data = std::equal(set1.begin(), set1.end(), 
          set2.begin(), 
          compareNoCase()); 

std::multiset保證參數化該「你好」和「HELLO」,在相同向量被視爲一個值,並且std::equal的參數化保證跨向兩個向量。

最後,如果您知道在同一個vector中沒有出現兩次元素,則可以使用set而不是multiset。請注意,最好從一開始就使用setmultiset

+0

我相信OP表示比較C-Strings的向量。在這種情況下,您無法將兩組char *與==相比較,並獲得合理的結果。但OP可能自然地混淆了術語 – 2010-10-24 13:50:59

+0

@Armen:我不確定'CString'應該是什麼。我會等待OP澄清,然後根據需要更改我的帖子。 – fredoverflow 2010-10-24 13:52:34

+0

@紅:嗯,你想「你好」等於「你好」嗎? – fredoverflow 2010-10-24 13:55:58

2

如果(A,B,C)和(B,C,A)是同樣的話那麼向量一個不錯的選擇,使用std::setstd::multiset代替,並且如前所述,將它們與std::equal進行比較並通過strcmp作爲比較器參數。這個答案是有效的,如果通過CString你的意思是C樣式空終止字符數組。如果CString意味着MFC CString,FredOverflow的答案是完美的。

0

首先用std :: sort對它們進行排序,然後將它們與std :: equal進行比較。

0

不要使用簡單的循環。相反,您可以使用迭代器從兩個向量中檢索元素,然後使用_tcscmp或wcscmp比較這些值。

相關問題