2010-12-07 63 views
1

私はMFCとC++のアプリケーションにはかなり新しいので、私の質問があまりにも些細な場合はお詫び申し上げます。とにかに私の上司にはVC++で書かれたレガシーコードがあり、ソートする必要のあるCObListに格納されているオブジェクトのリストがあります。私はそのオブジェクトに格納されている整数値に基づいてこのリストをソートする必要があります。これを行う簡単な方法はありますか?CObListを簡単にソートする方法はありますか?

答えて

0

これはすでに分かっているはずです.C++を初めてお使いの方は、MFCコレクションクラス(CObListCArrayなど)を使用しないでください。代わりに、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

+0

'std :: sort'はランダムアクセスイテレータを必要とします。通常はリンクリストにはありません。 'std :: list'はその問題を回避する組み込みの' sort'演算を持っています。 – Nate

関連する問題