2013-02-17 50 views
5

मैं 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 साथ यह करने के लिए प्रबंधित नहीं किया:

यहाँ मैं के साथ समाप्त हो गया है। क्या यह हासिल करने के लिए एक और सी ++ अनुपालन तरीका है?

संपादित: यह कोड मैं जवाब के बाद है:

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

आपको यह देखने की ज़रूरत है कि यह 'block.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; }); 
}