2010-12-07 2 views
1

Я довольно новичок в приложениях MFC и C++, поэтому прошу прощения, если мой вопрос слишком тривиален. В любом случае у моего босса есть код устаревшего кода, написанный на VC++, и есть список объектов, хранящихся в CObList, который мне нужно сортировать. Мне нужно отсортировать этот список на основе некоторого целочисленного значения, хранящегося в этом объекте. Есть простой способ сделать это?Есть ли простой способ сортировки CObList?

ответ

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... 
+0

альтернативой было бы определить итераторы, работающих на `CObList`. Но для кого-то нового для C++ это, наверное, немного приключение. – jalf 2010-12-08 11:51:27