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

Zai*_*mir 0 c++ comparison mfc stl vector

我试图找到最有效,最优化和最快速的方法来比较CString的标准向量.有问题的字符串区分大小写.我已经尝试将==运算符用于向量容器,但这有时会返回误报.我的意思是,例如,如果一个向量包含顺序(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;
             }
        }

  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码没有经过测试,我不确定是否有更好的方法可以实现这种比较,而无需使用嵌套循环.

非常感谢任何建议或帮助......

fre*_*low 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);
Run Code Online (Sandbox Code Playgroud)

如果你想忽略这种情况(你的问题中的代码似乎暗示了这种情况),你可以参数化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());
Run Code Online (Sandbox Code Playgroud)

同一向量中的std::multiset"hello"和"HELLO" 的保证参数化视为一个值,并通过两个向量保证参数化.std::equal

最后,如果你知道没有元素在同一个元素中出现两次vector,你可以使用set而不是multiset.请注意,从一开始就使用set或更好地使用它可能更好multiset.