Я довольно новичок в приложениях MFC и C++, поэтому прошу прощения, если мой вопрос слишком тривиален. В любом случае у моего босса есть код устаревшего кода, написанный на VC++, и есть список объектов, хранящихся в CObList, который мне нужно сортировать. Мне нужно отсортировать этот список на основе некоторого целочисленного значения, хранящегося в этом объекте. Есть простой способ сделать это?Есть ли простой способ сортировки CObList?
1
A
ответ
0
Возможно, вы уже знаете это: если вы новичок в C++, не используйте классы коллекции MFC (CObList
, CArray
и т. Д.). Вместо этого используйте STL (std::vector
, std::list
и т. Д.). Менеджер продуктов для Visual C++ сказал столько же here (ищите сообщение от RonaldLaeremans).
Но иногда у вас есть устаревший код, и вы должны использовать коллекции MFC.
ли вы действительно нужно отсортировать список, или вы можете жить с отсортированных копиями списка? Если последнее, было бы довольно легко скопировать список в std::vector
и отсортировать его. Конечно, вы только копируете указатели или ссылки, поэтому не накладываетесь на накладные расходы на создание дополнительных копий объектов, хранящихся в списке.
Что-то вроде этого:
std::vector<const CObject*> v;
for (POSITION pos = theList.GetHeadPosition(); pos != NULL;) {
v.push_back(theList.GetNext(pos));
}
// Use your own comparison function. Here I used a lambda (available
// in Visual C++ 2010), but you could pass any function that returns
// true iff the first item is less than the second item.
auto comparisonFunction = [](const CObject* left, const CObject* right)->bool {
return (left->m_yourStoredValue < right->m_yourStoredValue);
};
std::sort(v.begin(), v.end(), comparisonFunction);
// Use the results...
альтернативой было бы определить итераторы, работающих на `CObList`. Но для кого-то нового для C++ это, наверное, немного приключение. – jalf 2010-12-08 11:51:27