2010-10-24 127 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比较这些值。

相关问题