我从 API 收到 Foo 的向量,如下所示:
std::vector<Foo> foos;
然后我写了一个名为
std::vector<std::string> getKeys(const std::vector<Foo>&)
它遍历容器并为每个 Foo 对象提取 std::string 类型的键。
您将如何按排序顺序遍历 foos 中的 Foo 对象,其中排序是在键上完成的,并且以不区分大小写的方式进行。此外,我不想制作 foos 的排序副本,因为它的大小很大。
这是我的尝试,它有效,但我想知道它是否可以做得更好。
struct CaseInsensitiveComparitor {
bool operator ()(const std::pair<std::string, Foo&> lhs, const std::pair<std::string, Foo&> rhs) const {
std::string str1 = lhs.first;
boost::algorithm::to_lower(str1);
std::string str2 = rhs.first;
boost::algorithm::to_lower(str2);
return (str1 < str2);
}
};
// map key to Foo
std::vector<std::pair<std::string, Foo*> > tempFoos;
{
std::vector<std::string> keys = getKeys(foos);
std::vector<std::string>::iterator begin = keys.begin();
std::vector<std::string>::iterator i = keys.begin();
std::vector<std::string>::iterator end = keys.end();
for(;i!=end;++i)
{
tempFoos.push_back(*i, &foos[distance(begin,i)]);
}
std::sort(tempFoos.begin(), tempFoos.end(), CaseInsensitiveComparitor());
}
std::vector<Foo*> sortedFoos;
std::vector<std::pair<std::string, Foo*> >::iterator i = tempFoos.begin();
std::vector<std::pair<std::string, Foo*> >::iterator end = tempFoos.end();
for(;i!=end;++i)
{
sortedFoos.push_back(i->second);
}