【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19048

構造体のvectorからfind
投稿者---エビス丸(2005/01/05 19:45:24)


お世話になっております。
また質問させてください。よろしくお願いします。

No.19041〜 のスレの続きではあるのですが、前スレの内容とは少し離れてきたので、
別スレとさせていただきました。

環境ですが、C++ SDK で winsock の非同期通信でのメッセージを元に処理をしています。
前スレで質問させていただいた構造体には、ソケットのハンドルと、
それに付随するデータが vector で格納されています。

メッセージがあがってきた際、WPARAM wp には、要求元のソケットハンドルが格納されてくるので、
このハンドルを先ほどの vector の中から find 関数で検索したいのです。
struct tblarea {
 int  A;
  char B; 
};

vector<tblarea> tbl_dt;
vector<tblarea>::iterator itr;

itr = find(tbl_dt.begin(), tbl_dt.end(), wp);
さしあたって、上記のように記述してみたのですが、
どうにも、3番目の値である検索対象の与え方がわかりません。
ご指導くださいますでしょうか。
よろしくお願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体のvectorからfind 19049 monkey 2005/01/05 21:39:00


No.19049

Re:構造体のvectorからfind
投稿者---monkey(2005/01/05 21:39:00)


find関数は、配列の要素と第3引数の値が「等しい」関係かどうかを'==演算子'で判定します。
tbl_dtの要素の中からwpと「等しい」関係にあるものを探すのであれば、tblarea型のデータとWPARAM型のデータが
「等しい」かどうかを判定するための'==演算子'を自分で定義する必要があります。

bool operator == ( const tblarea& lhs, const WPARAM& rhs )
{
    // 「等しい」ときにtrueを,そうでないときに false を返す
    // どのような場合を「等しい」とするかは、プログラムの仕様次第
}

# '!=演算子'で判定する実装もあるようなので、両方定義しておいた方が良いかも。



この投稿にコメントする

削除パスワード

No.19050

Re:構造体のvectorからfind
投稿者---επιστημη(2005/01/06 10:09:01)


> [等しい」かどうかを判定するための'==演算子'を自分で定義する必要があります。

あるいは:

struct equal_shandle {
  WPARAM wparam_;
  equal_shandle(WPARAM w) : wparam_(w) {}
  bool operator()(const tblarea& x) const {
    wparam_ と一致すればtrueを返す
  }
};

...
result = find_if(ここから, ここまで, equal_shandle(wp));





この投稿にコメントする

削除パスワード

No.19052

Re:構造体のvectorからfind
投稿者---エビス丸(2005/01/06 10:42:41)


おはようございます。
レスかいてる間にさらに詳しいレスが^^;
ありがとうございます。

struct tblarea
 SOCKET A; //ソケットのハンドル
 char B;
 tblarea(const int& a) : A(a) {} //←こいつ
};

bool operator==(const tblarea& x, const tblarea& y) {
 return x.A == y.A;
}

BOOL CALLBACK Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
 vector<tblarea> tbl_dt;
 vector<tblarea>::iterator itr;
 ・・・
 itr = find(tbl_dt.begin(), tbl_dt.end(), tblarea(wp));
 ・・・
}

こんなかんじで考えてみたのでしょうが、いかがでしょうか?
まだコンパイルしてませんが・・・
ただ、矢印でしめした行がなんとなくわかるのですが、
はっきりわからないので、解説いただけませんでしょうか?
ここまでくれば、自明の気がするのですが、物事の詰めがどうにも苦手で…
よろしくお願いします。



この投稿にコメントする

削除パスワード

No.19053

Re:構造体のvectorからfind
投稿者---επιστημη(2005/01/06 11:08:09)


> こんなかんじで考えてみたのでしょうが、いかがでしょうか?
> まだコンパイルしてませんが・・・

ではまずコンパイルしましょう。

> ただ、矢印でしめした行がなんとなくわかるのですが、
> はっきりわからないので、解説いただけませんでしょうか?

教科書を読みましょう。




この投稿にコメントする

削除パスワード

No.19054

Re:構造体のvectorからfind
投稿者---エビス丸(2005/01/06 11:46:45)


まったくもって仰る通りです。
申し訳ありません。

上記のソースをコンパイルしたところ、tblarea tbl_dt; で、
“error C2512: 'CLIENT_TBLAREA' : クラス、構造体、共用体にデフォルト コンストラクタがありません。”
とのこと。コンストラクタとはなんぞや…調べ中です。
#MSDNで用語を調べようとしても、***とは…ってのがないのはナンデダロウ

> ただ、矢印でしめした行がなんとなくわかるのですが、
> はっきりわからないので、解説いただけませんでしょうか?
こちらも調べます。

それぞれわかりましたら、報告させていただきます。
たくさんのレスありがとうございました。


この投稿にコメントする

削除パスワード

No.19055

Re:構造体のvectorからfind
投稿者---επιστημη(2005/01/06 12:52:10)


>上記のソースをコンパイルしたところ、tblarea tbl_dt; で、
>“error C2512: 'CLIENT_TBLAREA' : クラス、構造体、共用体にデフォルト コンストラクタがありません。”
>とのこと。コンストラクタとはなんぞや…調べ中です。

tblarea(const int& a) : A(a) {}

これを以下のように変更してみてくださいな。

tblarea(int a=0) : A(a) {}

# デフォルトコンストラクタとは、[引数を持たない(あるいは省略できる)コンストラクタ]です。



この投稿にコメントする

削除パスワード

No.19056

Re:構造体のvectorからfind
投稿者---エビス丸(2005/01/06 13:45:38)


>tblarea(const int& a) : A(a) {}
>
>これを以下のように変更してみてくださいな。
>
>tblarea(int a=0) : A(a) {}

ありがとうございます。
さっそくやってみたところ、動作確認まで進むことができました!
上の書き方だと'a'にデフォルトで初期値が与えられないので、初期値を指定する
ということでしょうか。

これで先に進めそうです。
επιστημηさん、monkeyさんありがとうございました。



この投稿にコメントする

削除パスワード

No.19100

Re:構造体のvectorからfind
投稿者---とおりすがり(2005/01/09 13:29:16)


C++の基礎中の基礎であるコンストラクタが何かを本当に理解していないのなら、
STLよりもそちらを先に勉強する方が絶対近道。
というか、今後もC++ネタで詰まること間違いなしかと。


この投稿にコメントする

削除パスワード

No.19117

Re:構造体のvectorからfind
投稿者---エビス丸(2005/01/11 10:18:09)


貴重なアドバイスありがとうございます。
なるべく基礎から理解してコーディングするよう心がけてますが、
理解が遅いので、”動くものが先決!”という天の声も聞こえてきたり…
でもさっそく調べてみようと思います。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧