Есть ли простой способ сортировки CObList? - PullRequest
1 голос
/ 08 декабря 2010

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

1 Ответ

0 голосов
/ 08 декабря 2010

Вы, наверное, уже знаете это: если вы новичок в C ++, пожалуйста, не используйте классы коллекции MFC (CObList, CArray и т. Д.).Вместо этого используйте STL (std::vector, std::list и т. Д.).Менеджер по продукту для Visual C ++ сказал столько же здесь (ищите сообщение от RonaldLaeremans).

Но иногда у вас есть устаревший код, и вы должны использовать коллекции MFC.1010 *

Вам действительно нужно отсортировать список, или вы можете жить с отсортированной копией списка?Если последнее, было бы довольно легко скопировать список в 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...