STLの使用方法について – プログラミング – Home

通知
すべてクリア

[解決済] STLの使用方法について


あきんど
 あきんど
(@あきんど)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

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を取得する方法は上記の手順の逆を
 辿るしかないでしょうか?


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

そもそも,実はstd::map<UINT, std::set<CString> >を扱いたい,ということはありませ
んか?
どうも,キーはstd::pair<UINT, std::set<Cstring>ではなく,UINTのように思えるので
すが。


返信引用
あきんど
 あきんど
(@あきんど)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

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さん、ご教示ありがとうございました。


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

#掲題の質問とは異なる内容ですがご容赦ください。

例えば、文字列を扱うコンテナーに
・CArrayクラス、CListクラスにstd::string。
・std::map、std::vectorにCString。
のような使い方は避けるべし。と教わったのですが
本当になにか問題あるのでしょうか?(都市伝説?w)

#どれもテンプレートベースなので問題ないような気がします


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

「避けるべし」だけでは判断できません。
教えたひとに訊いてください。


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

遠い昔の話で確認しようがなく^^;
そなことは聞いたことない!ですか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

やったことないんでわかんねーです。
なんかの勘違いかも知れないし、ホントにヤバいことがあるのかも。

> #どれもテンプレートベースなので問題ないような気がします

イミフ。テンプレートベース「なので」ってどゆこと?


返信引用
あきんど
 あきんど
(@あきんど)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

>本当になにか問題あるのでしょうか?(都市伝説?w)

では今回の場合の解決策として、+さんならどの様に実現させます?


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

ちょっと誤解生んだかな・・・
昔「STLとMFCを混ぜるな危険」と教わり、
「今は平気で混ぜてるけど何かあるの?」と尋ねたわけで・・・

>スレ主へ
STLならstd::vector<string> myList;
MFCならCList<CString,CString&> myList;
と教わったけど。

今はstd::vector<CString> myList;とか普通に使ってる。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

std::vectorならCArrayでは?

CArray<CString, CString&>だったらCStringArrayを使うのが普通でしょうけど。
(CList<CString, CSTring&>ならCStringList)


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

DebugモードだとMFCがnewを置き換えちゃうのでSTLがコケるってのはありますけども。


返信引用
アキラ
 アキラ
(@アキラ)
ゲスト
結合: 23年前
投稿: 49
 

むしろMFCのコレクションクラスを使わない方がいいと思います。(個人的に)

CArrayとか、代入演算子がサポートされてないからとてもめんどくさいです。
begin(), end()がないからSTLのアルゴリズムに渡しづらいですしね。
(先頭要素へのポインタと最後尾要素へのポインタを直接渡せばできますけど)

私はstd::vector<CString>とか実際使ってますよ。(MFC6.0 ~ MFC8.0)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました