2013-02-17 15 views
5

Mam mały problem ze znalezieniem elementu w wektorze shared_ptr.Znajdowanie elementu w pojemniku shared_ptr?

Oto, co skończyło się z:

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; 
} 

Jednak nie udało się zrobić to z std::find lub nawet std::find_if. Czy istnieje lepszy sposób, aby to osiągnąć?

EDIT: Jest to kod mam po odpowiedź:

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

Więc szukasz 'shared_ptr' do konkretnego _raw pointer_? –

+0

Na marginesie, jeśli potrzebujesz znaleźć elementy w swoim pojemniku, wektor <> nie powinien być twoim ulubionym pojemnikiem. Otrzymasz znacznie lepszą wydajność z zamówionym (posortowanym) pojemnikiem – eladidan

+0

Tak, 'std :: set' przychodzi na myśl. – user1095108

Odpowiedz

6

Spróbuj:

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

Musisz sprawdzić, czy to nie jest 'blocks.end()', aby sprawdzić, czy jest on w wektorze. – Xymostech

1

Na podstawie odpowiedzi i komentarze od innych, oto próbka całkowicie pracy z 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; 
} 

Oto wynik:

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

dzięki za pełną próbkę kompilacji i pracy! – bquenin

+0

Nie ma problemu. Widzę, że niezależnie od ciebie również przyszedłeś do odpowiedzi. –

1

jeszcze prostsze:

bool contains(Block* block) { 
    return std::any_of(blocks.cbegin(), blocks.cend(), 
        [block](std::shared_ptr<Block> const& i) { return i.get() == block; }); 
} 
Powiązane problemy