WinXp、VC6.0++、MFC使用
[0] aaa bbb ccc
[1] xxxxxxxxx yyy zz
:
:
[n] aa bb cc dd
上記の様なデータを扱いたく、
std::set< std::pair<UINT, std::set<CString> > > DATA;
と宣言しましたが、直接std::set<CString>へCstringを
代入する方法が判りません。
そこで仕方なく
std::set<CString> Text;
std::pair<UINT, std::set<CString> > PairIndex;
std::set< std::pair<UINT, std::set<CString> > > DATA;
と分けて宣言して…
for(UINT No = 0; No < 10; No++) {
// Item(テキスト)を保存
for(UINT cnt = No * 10; cnt < No * 10 + 10; cnt++) {
Text.insert(m_listview.GetItemText(cnt, 0));
}
// 保存
PairIndex.first = No;
PairIndex.second = Text;
DATA.insert(PairIndex);
}
で、CStringの値が代入されている事は(デバッガ上で)確認しました。
★伺いたい事
ベストな使い方(アクセス方法等)はこれで良いのでしょうか?
また、この代入されたCStringを取得する方法は上記の手順の逆を
辿るしかないでしょうか?
そもそも,実はstd::map<UINT, std::set<CString> >を扱いたい,ということはありませ
んか?
どうも,キーはstd::pair<UINT, std::set<Cstring>ではなく,UINTのように思えるので
すが。
YuOさん
>どうも,キーはstd::pair<UINT, std::set<Cstring>ではなく,UINTのように
>思えるのですが。
ご指摘の通り、初めに出て来るUINTがキーとなる事を想定しておりました。
ご教示にあった様にmapで書き直してみると、あらま…。
# 今回mapを初めて使用した事は誰にも秘密。。
と、言う訳で(下手ですが)一応ソースを残しておきます。
std::set<CString> Text;
std::map<UINT, std::set<CString> > DATA;
for(UINT No = 0; No < 10; No++) {
// Item(テキスト)を保存
for(UINT cnt = No * 10; cnt < No * 10 + 10; cnt++) {
Text.insert(m_listview.GetItemText(cnt, 0));
}
// 保存
DATA[No] = Names;
// 本当にセットされたか、確認する!
std::map<UINT, std::set<CString> >::iterator DATAPos = DATA.begin();
std::map<UINT, std::set<CString> >::iterator DATAEnd = DATA.end();
for (; DATAPos != DATAEnd; DATAPos++) {
TRACE(PartsFiles[%d]\n, (*DATAPos).first);
std::set<CString>::iterator TEXTPos = (*DATAPos).second.begin();
std::set<CString>::iterator TEXTEnd = (*DATAPos).second.end();
for(; TEXTPos != TEXTEnd; TEXTPos++) {
TRACE([%s]\n, *TEXTPos);
}
}
YuOさん、ご教示ありがとうございました。
#掲題の質問とは異なる内容ですがご容赦ください。
例えば、文字列を扱うコンテナーに
・CArrayクラス、CListクラスにstd::string。
・std::map、std::vectorにCString。
のような使い方は避けるべし。と教わったのですが
本当になにか問題あるのでしょうか?(都市伝説?w)
#どれもテンプレートベースなので問題ないような気がします
「避けるべし」だけでは判断できません。
教えたひとに訊いてください。
遠い昔の話で確認しようがなく^^;
そなことは聞いたことない!ですか?
やったことないんでわかんねーです。
なんかの勘違いかも知れないし、ホントにヤバいことがあるのかも。
> #どれもテンプレートベースなので問題ないような気がします
イミフ。テンプレートベース「なので」ってどゆこと?
>本当になにか問題あるのでしょうか?(都市伝説?w)
では今回の場合の解決策として、+さんならどの様に実現させます?
ちょっと誤解生んだかな・・・
昔「STLとMFCを混ぜるな危険」と教わり、
「今は平気で混ぜてるけど何かあるの?」と尋ねたわけで・・・
>スレ主へ
STLならstd::vector<string> myList;
MFCならCList<CString,CString&> myList;
と教わったけど。
今はstd::vector<CString> myList;とか普通に使ってる。
std::vectorならCArrayでは?
CArray<CString, CString&>だったらCStringArrayを使うのが普通でしょうけど。
(CList<CString, CSTring&>ならCStringList)
DebugモードだとMFCがnewを置き換えちゃうのでSTLがコケるってのはありますけども。
むしろMFCのコレクションクラスを使わない方がいいと思います。(個人的に)
CArrayとか、代入演算子がサポートされてないからとてもめんどくさいです。
begin(), end()がないからSTLのアルゴリズムに渡しづらいですしね。
(先頭要素へのポインタと最後尾要素へのポインタを直接渡せばできますけど)
私はstd::vector<CString>とか実際使ってますよ。(MFC6.0 ~ MFC8.0)