Я получаю от API вектор Foo следующим образом:
std::vector<Foo> foos;
Затем я написал функцию с именем
std::vector<std::string> getKeys(const std::vector<Foo>&)
который перебирает контейнер и извлекает ключ типа std::string для каждого объекта Foo.
Как бы вы перебирали объекты Foo в foos в отсортированном порядке, где сортировка выполняется по ключу и без учета регистра. Кроме того, я бы предпочел не делать отсортированную копию 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);
}
sortedFoos
, прежде чем объявить его, вы увеличиваетеend
, а неi
, это определенно не (часть) кода, который вы пытались - person Pieter   schedule 05.09.2013Foo
s? - person juanchopanza   schedule 05.09.2013