←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


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

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

 詳しくはこちら



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

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


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

No.3764

vectorのinsertについて
投稿者---kaz(2005/05/21 23:20:01)


vecotorのinsertについて教えていただきたいのですが、以下にプログラムを示します。
mElemsはvector<T>です。

template<typename T>
void Node<T>::insertElem(const T& newElem){
    for(vector<int>::iterator i=mElems.begin();
        i!=mElems.end(); i++){
        if (*i > newElem){
            mElems.insert(i,newElem);
            return;
        }
    }
    mElems.push_back(newElem);
}




template<typename T>
void Node<T>::insertElem(const T& newElem){
    int counter = 0;
    for(int i=0,len=mElems.size(); i<len; i++){
        if (mElems[i] > newElem){
            mElems.insert(mElems.begin()+counter,newElem);
            return;
        }
        counter++;
    }
    mElems.push_back(newElem);
}


このようにinsertion sortをしているんですが、上の方の例だとinterator<T>がひっかかってコンパイラーから警告がでました。(コンパイラーはg++です。)
そこで2ばんめの例のようになおすとうまくいったのですが、本当にこんな風にするものなのかと気になったので投稿させていだだきました。


こんなものなのでしょうか?もっとよい方法があれば教えてください。よろしくお願いします。ちなみに<algorithm>のsortをつかわないのはvectorのinsertの使いかたの勉強のためにやっています。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:vectorのinsertについて 3765 あかま 2005/05/21 23:43:32
<子記事> Re:vectorのinsertについて 3769 かずま 2005/05/22 03:57:13


No.3765

Re:vectorのinsertについて
投稿者---あかま(2005/05/21 23:43:32)


for(vector<int>::iterator i=mElems.begin();

for(vector<T>::iterator i=mElems.begin();

でないかな?


この投稿にコメントする

削除パスワード

No.3766

Re:vectorのinsertについて
投稿者---kaz(2005/05/22 00:04:23)


>for(vector<int>::iterator i=mElems.begin();
>↓
>for(vector<T>::iterator i=mElems.begin();
>
>でないかな?

あ、そうです。vector<T>にしてたらwarnningがでました。intにしてみたらでませんでした。すいません、もどすの忘れていました。で、insertのほうはあのようにして使うものなんでしょうか?もし、よろしければ教えてください。


この投稿にコメントする

削除パスワード

No.3767

Re:vectorのinsertについて
投稿者---monkey(2005/05/22 00:28:30)


1番目も2番目もinsertの使い方に間違いはないと思います。

1番目のコンパイル時に出た警告とは、どういう内容でしょうか?
掲げられたコードの範囲では何か問題があるようには見えないのですが。

また、2番目はいくぶん冗長(無駄な変数がある)ですね。
次のように書いても良いのではないでしょうか。

template< typename T >
void Node< T >::insertElem( const T& newElem ){
    for( std::vector< T >::size_type i = 0; i < mElems.size(); ++i ){
        if( mElems[i] > newElem ){
            mElems.insert( mElems.begin() + i, newElem );
            return;
        }
    }
    mElems.push_back( newElem );
}

蛇足ながら、"反復子+整数"の演算が可能なのは、ランダムアクセス反復子を提供する型(vector, deque, stringなど)なので、
2番目の方法は、コンテナの型をlistに変更したりするとコンパイルできなくなります。

ご参考までに、

#include <algorithm>  // find_if
#include <functional> // bind2nd, greater

template< typename T >
void Node< T >::insertElem( const T& newElem ){
    mElems.insert( std::find_if( mElems.begin(), mElems.end(), std::bind2nd( std::greater< T >(), newElem ) ), newElem );
}

とも書けます。



この投稿にコメントする

削除パスワード

No.3768

Re:vectorのinsertについて
投稿者---iijima(2005/05/22 00:30:45)


すみません。旧HNで投稿してしまいました。
"monkey"改め"iijima"です。


この投稿にコメントする

削除パスワード

No.3769

Re:vectorのinsertについて
投稿者---かずま(2005/05/22 03:57:13)


>    for(vector<int>::iterator i=mElems.begin();
 
これを次のようにしてみて下さい。

     for (typename vector<T>::iterator i = mElems.begin();



この投稿にコメントする

削除パスワード

No.3772

Re:vectorのinsertについて
投稿者---kaz(2005/05/22 22:53:08)


><pre>
> for(vector<int>::iterator i=mElems.begin();

これを次のようにしてみて下さい。

for (typename vector<T>::iterator i = mElems.begin();
</pre>

かずまさん、iijimaさんありがとうございます。
かずまさんにいわれたとおりにしてみたらwanningなくなりました。
以下のwarnningがでていたのですが、

In file included from btree.h:125,
from Main.cpp:1:
btree.tem: In member function `void Node<T>::insertElem(const T&)':
btree.tem:35: warning: `std::vector<T, std::allocator<_CharT> >::iterator' is
implicitly a typename
btree.tem:35: warning: implicit typename is deprecated, please see the
documentation for details

deprecatされたとのことですが、以前はいけていたのでしょうか?
なぜ、typenameをつけることで解消されたのでしょうか、よろしければ教えてください。よろしくお願いします。


この投稿にコメントする

削除パスワード

No.3773

Re:vectorのinsertについて
投稿者---かずま(2005/05/23 00:57:21)


> deprecatされたとのことですが、以前はいけていたのでしょうか?
> なぜ、typenameをつけることで解消されたのでしょうか、

規格書 ISO/IEC 14882:1998 の 14 Templates の 14.6 Name resolution の
ところに、次のように書かれています。

: A name used in a template declaration or definition and that is
: dependent on a template-parameter is assumed not to name a type
: unless the applicable name lookup finds a type name or the name
: is qualified by the keyword typename.

今回の場合の vector<T>::iterator は、T が決まるまでは型名かデータ名か
確定できないので、型名として解釈して欲しかったら、typename を付けなけ
ればならないということになります。


# プログラムを引用するときは、<pre> などをそのままにせず、引用の各行の
# 先頭に > をきちんとつけて HTML 変換ツールを利用するなどの配慮をお願い
# します。


この投稿にコメントする

削除パスワード

No.3774

Re:vectorのinsertについて
投稿者---kaz(2005/05/23 13:35:37)


かずまさんありがとうございます。おかげさまで理解することができました。

># プログラムを引用するときは、<pre> などをそのままにせず、引用の各行の
># 先頭に > をきちんとつけて HTML 変換ツールを利用するなどの配慮をお願い
># します。

大変、失礼しました。以後、気をつけます。


この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity