2013-02-17 13 views
5

shared_ptrというベクトルの要素を見つけるのに少し問題があります。shared_ptrコンテナ内の要素を検索していますか?

std::vector<std::shared_ptr<Block>> blocks; 

bool contains(Block* block) { 
    for (auto i = blocks.begin(); i != blocks.end(); ++i) { 
    if ((*i).get() == block) { 
     return true; 
    } 
    } 
    return false; 
} 

しかし、私はstd::findあるいはstd::find_ifでそれを行うために管理していなかった。ここで

は私がなってしまったものです。これを達成するためのより多くのC++準拠の方法がありますか?

EDIT

bool contains(Block* block) { 
    auto found = std::find_if(blocks.begin(), blocks.end(), [block](std::shared_ptr<Block> const& i){ 
    return i.get() == block; 
    }); 
    return found != blocks.end(); 
} 
+0

だから、特定の_rawのpointer_に 'shared_ptr'を探していますか? –

+0

補足として、コンテナ内の要素を検索する必要がある場合は、ベクトル<>を選択したコンテナにするべきではありません。あなたは順序付けされた(ソートされた)コンテナでもっと良いパフォーマンスを得るでしょう。 – eladidan

+0

はい、 'std :: set'が気になります。 – user1095108

答えて

6

試してください::これは答えの後に私が持っているコードです

std::find_if(blocks.begin(), blocks.end(), 
    [block](std::shared_ptr<Block> const& i){ return i.get() == block; }); 
+3

それが 'blocks.end()'でないかどうかを確認して、ベクトル内にあるかどうかを確認する必要があります。 – Xymostech

1

他人からの回答やコメントをもとに、ここから完全に動作するサンプルですideone:ここ

#include <vector> 
#include <memory> 
#include <algorithm> 
#include <iostream> 

using namespace std; 

struct Block 
{ 
    bool in_container(const vector<shared_ptr<Block>>& blocks) 
    { 
     auto end = blocks.end(); 
     return end != find_if(blocks.begin(), end, 
           [this](shared_ptr<Block> const& i) 
            { return i.get() == this; }); 
    } 
}; 

int main() 
{ 
    auto block1 = make_shared<Block>(); 
    auto block2 = make_shared<Block>(); 

    vector<shared_ptr<Block>> blocks; 
    blocks.push_back(block1); 

    block1->in_container(blocks) ? 
     cout << "block1 is in the container\n" : 
     cout << "block1 is not in the container\n"; 

    block2->in_container(blocks) ? 
     cout << "block2 is in the container\n" : 
     cout << "block2 is not in the container\n"; 

    return 0; 
} 

は、出力は次のようになります。

block1 is in the container 
block2 is not in the container 
+0

完全なコンパイル可能なサンプルをありがとう! – bquenin

+0

問題ありません。私は、あなたが独立して答えに来たのを見る。 –

1

さらに簡単:

bool contains(Block* block) { 
    return std::any_of(blocks.cbegin(), blocks.cend(), 
        [block](std::shared_ptr<Block> const& i) { return i.get() == block; }); 
} 
関連する問題