我正在尝试找到最有效,最优化和最快速的方法来与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;
}
}
}
}
上面的代码没有经过测试,我不确定是否有更好的方法可以实现这种比较,而无需使用嵌套循环。
感谢任何建议或帮助...
答案 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::multiset
和std::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
。请注意,从一开始就使用set
或multiset
可能更好。
答案 1 :(得分:2)
如果(a,b,c)和(b,c,a)对你来说是相同的,那么向量是一个糟糕的选择,改为使用std::set
或std::multiset
,并且如前所述,将它们与std::equal
进行比较,并将strcmp
作为比较器参数传递。如果CString指的是C风格的以null结尾的char数组,那么这个答案是有效的。如果CString意味着MFC CString,那么FredOverflow的答案是完美的。
答案 2 :(得分:0)
首先使用std :: sort对它们进行排序,然后将它们与std :: equal进行比较。
答案 3 :(得分:0)
不要使用简单的for循环。相反,您可以使用迭代器从两个向量中检索元素,然后使用_tcscmp或wcscmp比较值。