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

时间:2010-10-24 13:38:03

标签: c++ mfc stl vector comparison

我正在尝试找到最有效,最优化和最快速的方法来与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;
             }
        }

  }
}

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

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

4 个答案:

答案 0 :(得分: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”和“HELLO”被视为一个值,std::equal的参数化保证了这一点。两个载体。

最后,如果您知道在同一个vector中没有元素出现两次,则可以使用set代替multiset。请注意,从一开始就使用setmultiset可能更好。

答案 1 :(得分:2)

如果(a,b,c)和(b,c,a)对你来说是相同的,那么向量是一个糟糕的选择,改为使用std::setstd::multiset,并且如前所述,将它们与std::equal进行比较,并将strcmp作为比较器参数传递。如果CString指的是C风格的以null结尾的char数组,那么这个答案是有效的。如果CString意味着MFC CString,那么FredOverflow的答案是完美的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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