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