2013-02-17 43 views
5

Tôi gặp sự cố nhỏ khi tìm phần tử trong vectơ của shared_ptr.Tìm phần tử trong vùng chứa shared_ptr?

Đây là những gì tôi đã kết thúc với:

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

Tuy nhiên, tôi đã không quản lý để làm điều đó với std::find hoặc thậm chí std::find_if. Có cách nào tương thích hơn C++ để đạt được điều này không?

EDIT: Đây là đoạn code tôi có sau khi câu trả lời:

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

Vì vậy, bạn đang tìm kiếm một 'shared_ptr' đến một pointer_ _raw cụ thể? –

+0

Như một lưu ý phụ, nếu bạn cần tìm các phần tử trong thùng chứa của bạn thì vector <> không nên là vùng chứa của bạn. Bạn sẽ nhận được hiệu suất tốt hơn nhiều với một container (sắp xếp) theo thứ tự – eladidan

+0

Có, 'std :: set' đến với tâm trí. – user1095108

Trả lời

6

Hãy thử:

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

Bạn cần kiểm tra xem đó không phải là 'blocks.end()', để xem nó có nằm trong vectơ hay không. – Xymostech

1

Dựa trên các câu trả lời và ý kiến ​​từ những người khác, đây là một mẫu hoàn toàn làm việc từ 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; 
} 

Đây là kết quả:

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

cảm ơn bạn đã làm mẫu và làm việc trọn vẹn! – bquenin

+0

Không sao cả. Tôi thấy rằng bạn cũng đã trả lời một cách độc lập. –

1

Thậm chí đơn giản hơn:

bool contains(Block* block) { 
    return std::any_of(blocks.cbegin(), blocks.cend(), 
        [block](std::shared_ptr<Block> const& i) { return i.get() == block; }); 
} 
Các vấn đề liên quan