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

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

 詳しくはこちら



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

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


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

No.19190

イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 09:46:18)


おはようございます。
先日はお世話になりまして、ありがとうございました。

本日は、イテレータについて質問させてください。
メインルーチンで取得したイテレータを自作関数に渡したいのですが、
受け取る側の自作関数で、イテレータの型をどのように指定すればよいのか
わからず困っています。

やりたいイメージは以下のソースです。
※コンテナにvectorを使っていますがその名前や、
  begin()の()などは省略しました

main() {
   iterator itr;

   swich( msg ){
   case WM_btnA:
      for( itr=begin; itr<end; itr++)
         自作関数( itr );
      break;
   case WM_btnB:
      //まだ作ってません
      vector要素が表示されたリストボックスから複数選択
          自作関数( itr );
      break;
   }
}

自作関数( ***** itr ) //←ここです
{
   /* 処理 */
}

ご教授くださいますよう、よろしくお願いいたします。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:イテレータを関数に渡す 19191 επιστημη 2005/01/14 10:18:20
<子記事> Re:イテレータを関数に渡す 19195 REE 2005/01/14 11:30:32


No.19191

Re:イテレータを関数に渡す
投稿者---επιστημη(2005/01/14 10:18:20)



> 受け取る側の自作関数で、イテレータの型をどのように指定すればよいのか
わからず困っています。

なにがわからんのかわかりません。

> やりたいイメージは以下のソースです。
>   iterator itr;
>   for( itr=begin; itr<end; itr++)
>         自作関数( itr );

…これのどこで悩んでいるのでしょうか?

#include <iostream>

template<typename Iterator>
void print(Iterator itr) {
  std::cout << *itr << std::endl;
}

#include <vector>

int main() {
  int data[] = { 1, 2, 3 };
  std::vector<int> v(data, data+3);
  for ( std::vector<int>::iterator itr = v.begin();
        itr != v.end(); ++itr ) {
    print(itr);
  }
  return 0;
}




この投稿にコメントする

削除パスワード

No.19192

Re:イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 10:55:30)


>#include <iostream>
>template<typename Iterator>
>void print(Iterator itr) {
> std::cout << *itr << std::endl;
>}

επιστημηさん、たびたびありがとうございます。
僕がわからなかったのは、示していただいたソースの中で、
引用した部分の上3行でした。
επιστημηさんのサイトを見直してみましたが、ちゃんと書いてありますね^^;
理解できていないようです。もうしわけありません。
上記の通りやるとうまくいきました。

さらにひとつステップアップというか、欲を出して、
この関数を前方宣言してmain関数の後ろに置こうとしていますが、
うまくいってません・・・
しばらくしたら報告させていただきます。


この投稿にコメントする

削除パスワード

No.19196

Re:イテレータを関数に渡す
投稿者---かずま(2005/01/14 12:03:18)


> この関数を前方宣言してmain関数の後ろに置こうとしていますが、
> うまくいってません・・・
template <typename Iterator> void print(Iterator it);

#include <vector>

int main()
{
    int data[] = { 1, 2, 3 };
    std::vector<int> v(data, data + 3);
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
        print(it);
}

#include <iostream>

template <typename Iterator>
void print(Iterator it)
{
    std::cout << *it << std::endl;
}



この投稿にコメントする

削除パスワード

No.19203

Re:イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 13:26:29)


ありがとうございます。

示していただいた方法もやってみました。
前方宣言内で、変数も一緒に定義するのがポイントですね。

下にもソースを上げておきましたが、どちらの方法でもよいようです。
あとは好みなんでしょうね。
自由度が高いというか、惑わされるというか…
ありがとうございました。
次もありましたら、是非よろしくお願いいたします。


この投稿にコメントする

削除パスワード

No.19210

Re:イテレータを関数に渡す
投稿者---επιστημη(2005/01/14 14:29:27)


>前方宣言内で、変数も一緒に定義するのがポイントですね。

変数?

>下にもソースを上げておきましたが、どちらの方法でもよいようです。
>あとは好みなんでしょうね。

template<typename Iter> void f(Iter)



void f(vector<T>::iterator)

とは明確に違います。 '好み'なんかじゃありません。




この投稿にコメントする

削除パスワード

No.19211

Re:イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 15:15:12)


間違いを正す機会をありがとうございます。
ほんとに正せたのかはわかりませんが、考えてみました。

>変数?
引数ですね

>template<typename Iter> void f(Iter)
これが理解できてないのですが、Iter型を宣言して引数として宣言

>void f(vector<T>::iterator)
T型のiteratorを直接引数として宣言

ということだと思います。
今すぐには理解できませんが、Cとは付き合いが長くなりそうなので、
必ず物にしたいと思います。


この投稿にコメントする

削除パスワード

No.19212

Re:イテレータを関数に渡す
投稿者---monkey(2005/01/14 18:33:32)


>> template<typename Iter> void f(Iter)
> これが理解できてないのですが、Iter型を宣言して引数として宣言

Iter型のオブジェクトを引数とする関数fを宣言。
Iterは任意の型名を表します。
この場合、Iterが何型になるかは、関数f呼び出しのところで引数に渡されたオブジェクトの型に基づいてコンパイラが判断します。

>> void f(vector<T>::iterator)
> T型のiteratorを直接引数として宣言

vector< T >::iterator型オブジェクト(T型のデータを要素とするvector型オブジェクトの要素を指すことができる反復子)を引数とする関数fを宣言。
きちんと書くなら、

template < typename T >
void f( vector< T >::iterator );

> Cとは付き合いが長くなりそうなので、

templateはCではなくC++の仕様です。
厳密な規格については、'テンプレート'をキーワードにして、C++の参考書などで調べて下さい。


この投稿にコメントする

削除パスワード

No.19214

Re:イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 23:59:40)


レスを頂いてから5時間も過ぎているようです。
遅れて申し訳ありません。

関数宣言の違い、よくわかりました。ありがとうございます。
独学するとき、自分の理解力のなさに辟易します。

>> Cとは付き合いが長くなりそうなので、
>templateはCではなくC++の仕様です。
現在、VC++6.0 SDK で開発しているのですが、C、C++、VCをゴッチャにして呼んでいました。
それぞれ別のものですね。改めます。

# みなさま、たくさんのレス、ほんとうにありがとうございます。
# 丁寧に、かつ最後までのご指導、感謝しております。
# 私の周りには、Cの開発環境の経験者がおらず(最初は皆さんも同じであったかと思いますが)、
# また自分の学習能力の低さに困っていました。
# しかし、みなさんのおかげで形にすることができそうです。
# 今後もお世話になる事があるかと思いますが、なにとぞよろしくお願いいたします。


この投稿にコメントする

削除パスワード

No.19195

Re:イテレータを関数に渡す
投稿者---REE(2005/01/14 11:30:32)


テンプレート関数にしたくない場合には、以下のようにします。

自作関数(std::vector<int>::iterator itr)



この投稿にコメントする

削除パスワード

No.19197

Re:イテレータを関数に渡す
投稿者---エビス丸(2005/01/14 12:05:33)


>自作関数(std::vector<int>::iterator itr)

REEさん、ありがとうございます!

ご提示いただいた方法は一度試していました。
ただ、vectorに構造体を使っているんですが、
それを定義するより上のステップで前方宣言書いちゃダメですよね〜・・・
いや、ほんとバカです…orz

結果、このようになりました

#include <vector>
#include <iterator>
using namespace std;

struct tblarea {
   /* 要素 */
};
vector<tblarea> tbl;

BOOL 自作関数( vector<tblarea>::iterator );

main() {
  vector<tblarea>::iterator itr 
  ・・・
  自作関数( itr );
  ・・・
}

BOOL 自作関数( vector<tblarea>::iterator itr )
{
  /* 処理 */
}

main()から後ろいらない気もしますが、一応。
ありがとうございました。



この投稿にコメントする

削除パスワード

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