C++ 比较CString的两个向量的最佳方法是什么

C++ 比较CString的两个向量的最佳方法是什么,c++,mfc,stl,vector,comparison,C++,Mfc,Stl,Vector,Comparison,我试图找到最有效、优化和最快的方法来与CString的std向量进行比较。所讨论的字符串区分大小写。我曾尝试对向量容器使用==运算符,但有时会返回误报。我的意思是,例如,如果一个向量包含顺序为(a,b,c)的元素,而另一个向量包含顺序为(b,c,a)的元素,==运算符将返回false,即使它们共享相同的数据。另一件事是它不进行区分大小写的比较 我曾想过使用基本的嵌套循环方法,如下所示: //Not Tested BOOL bMatch = TRUE; for(int i=0; i<Vec

我试图找到最有效、优化和最快的方法来与CString的std向量进行比较。所讨论的字符串区分大小写。我曾尝试对向量容器使用==运算符,但有时会返回误报。我的意思是,例如,如果一个向量包含顺序为(a,b,c)的元素,而另一个向量包含顺序为(b,c,a)的元素,==运算符将返回false,即使它们共享相同的数据。另一件事是它不进行区分大小写的比较

我曾想过使用基本的嵌套循环方法,如下所示:

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

  }
}
//未测试
boolbmatch=TRUE;
对于(inti=0;iif(a,b,c)和(b,c,a)如果对您来说是相同的,那么向量是一个错误的选择,请使用
std::set
std::multiset
代替,并且,如前所述,将它们与
std::equal
进行比较,并将
strcmp
作为比较参数。如果通过CString,您指的是C样式的空终止字符数组,那么这个答案是有效的。如果CString意味着MFC CString,FredOverflow的答案是完美的

如果一个向量包含顺序为(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::multiset
的参数化保证了同一向量中的“hello”和“hello”被视为一个值,而
std::equal
的参数化保证了这两个向量之间的一致性


最后,如果您知道在同一
向量中没有元素出现两次,那么可以使用
set
而不是
multiset
。请注意,最好从一开始就使用
set
multiset

首先使用std::Sort对它们进行排序,然后将它们与std::equal进行比较。

不要这样做使用简单for循环。相反,您可以使用迭代器从两个向量中检索元素,然后使用_tcscmp或wcscmp比较值。

请定义“CString的两个向量”-它是
vector
vector
vector
还是别的什么?可能是简单的
string
?@Tim:
CString
大概是MFC字符串类。我认为它是不言自明的……但为了方便起见,它的向量和类型
CString
来自哪里?你包括了哪个标题来获取它?我相信We OP说比较C字符串的向量。在这种情况下,你不能比较两组字符*和==并得到合理的结果。但是OP可能很自然地混淆了terminology@Armen:我不确定什么是
CString
。我将等待OP的澄清,然后在必要时更改我的帖子。@Red:好的,你想要吗“hello”是否等于“hello”?
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());