c++11っぽくstd::vectorでindexをfindしたい

こんにちは。ヤマヤタケシです。
やっぱりC++だね!
c++11っぽくstd::vectorでindexをfindしたい!
ルー大柴か!

さて、配列の中の要素を探すという、基本的なことだからこそ、STLっぽくやりたい!

今回、欲しいのは配列の番号であり、値じゃない。
しかし、std::findで探せるのはiteratorだから、しょうがなくこう書きました。

int findIndex( int value )
{
    size_t len = m_array.size();
    for( size_t n = 0 ; n < len ; ++n ){
        if( m_array[ n ] == value ){
            return n;
        }
    }
    return -1;
}

これはもはやC言語と同じだ!
C++っぽくないぜよ?

改めて検索すると、さすが世界のStackoverflowですね。
良い答えがありました。これはSTLっぽい!
Stackoverflowから引用です。

std::vector::iterator iter = std::find(vec.begin(), vec.end(), value);
size_t index = std::distance(vec.begin(), iter);
if(index == vec.size())
    {
        //invalid
    }

引用ここまで。
std:distance。そんなものがあるんですね。素晴らしい!

ふふ、覚えたてのautoを使って、c++11っぽくこうしよう。

int findIndex( int value )
{
    auto iter = std::find( m_array.begin(), m_array.end(), value);
    size_t index = std::distance( m_array.begin(), iter );
    if(index == vec.size())
        {
            return -1;
        }
    return index;
}

これで俺もC++11の人の仲間入りだ!

そんじゃまた。

軽い気持ちで有名になりたいのでクリックをお願いします!

c++11っぽくstd::vectorでindexをfindしたい” への4件のコメント

  1. indexを返す時点でC++っぽくない

    template size_t findIndex( value_type value, container m_array)
    {
    auto iter = std::find(m_array.begin(), m_array.end(), value);

    if(iter != m_array.begin()){
    return iter – m_array.begin();
    }
    return -1;
    }

  2. ありがとうございます。
    関数までもテンプレートにする余地があったんですね。
    勉強になります。

  3. コンパイル確認はしていないがこっちのが方がC++っぽい。

    template
    size_t findIndex( value_type value, container m_array)
    {
    auto iter = std::find( m_array.begin(), m_array.end(), value);

    size_t index = std::distance( m_array.begin(), iter );

    if(index == vec.size())
    {
    return -1;
    }

    return index;
    }

コメントを残す

メールアドレスが公開されることはありません。