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)
上面的代码没有经过测试,我不确定是否有更好的方法可以实现这种比较,而无需使用嵌套循环.
非常感谢任何建议或帮助......
如果一个向量包含顺序(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::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());
Run Code Online (Sandbox Code Playgroud)
将同一向量中的std::multiset"hello"和"HELLO" 的保证参数化视为一个值,并通过两个向量保证参数化.std::equal
最后,如果你知道没有元素在同一个元素中出现两次vector,你可以使用set而不是multiset.请注意,从一开始就使用set或更好地使用它可能更好multiset.
| 归档时间: |
|
| 查看次数: |
2306 次 |
| 最近记录: |