gpt4 book ai didi

c++ - 比较两个 CString vector 的最佳方法是什么

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:59 24 4
gpt4 key购买 nike

我正在尝试找到最有效、最优化和最快的方法来与 CString 的标准 vector 进行比较。有问题的字符串区分大小写。我曾尝试对 vector 容器使用 == 运算符,但这有时会返回误报。我的意思是,例如,如果一个 vector 包含顺序为 (a,b,c) 的元素,而另一个 vector 包含顺序为 (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;
}
}

}
}

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

将不胜感激任何建议或帮助...

最佳答案

if one vector contains elements in the order (a,b,c) and the other has them in the order (b,c,a) the == operator will return false even thought they share the same data.

只需将数据插入两个容器中,顺序无关紧要并比较它们:

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 的参数化保证了相同 vector 中的“hello”和“HELLO”被视为一个值, 的参数化std::equal 在两个 vector 中保证这一点。

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

关于c++ - 比较两个 CString vector 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com