2014-02-06 4 views
1

У меня есть класс A с членом, который является вектором указателей объектов другого класса Bстанд :: найти на векторе объектных указателей

class A 
{ 
    std::vector<B*> m_member_A 

Теперь я хочу, чтобы выполнить std::find на m_member_A. . if(std::find(m_member_A.begin(), m_member_A.end(), B_obj*) != m_member_A.end())

std :: find не имеет смысла на таком векторе. Как достичь такой функциональности?

Как бы это изменилось, если бы это был вектор объектов B (не указатель)?

+2

Что вы имеете в виду, что не имеет смысла? –

+0

@LuchianGrigore Я думаю, он хочет сравнить по значению, а не указатели – Pedrom

+0

Я имел в виду, что это означало бы найти указатель. – ontherocks

ответ

2

Если вы хотите, чтобы найти указатель значения на указатель, вместо данного указателя, вы можете использовать std::find_if с соответствующим функтором:

struct Foo 
{ 
    int i; 
}; 

bool operator==(const Foo& lhs, const Foo& rhs) { return lhs.i == rhs.i; } 

std::vector<Foo*> v = ....; 

Foo f{42}; 

std::find_if(v.begin(), v.end(), [&f](const Foo* p) { return *p == f; }); 
+0

Вы не проверяете, является ли 'p! = Nullptr' ... – Jarod42

+0

@ Jarod42 Нет, я этого не делаю. До пользователя передать вектор, содержащий действительные указатели. – juanchopanza

+0

Так что сначала мне нужно перегрузить оператор сравнения, так как find использует оператор сравнения для сравнения. Я прав? – ontherocks

1

Вектор отлично работает с std::find

auto result = std::find(m_member_A.begin(), m_member_A.end(), itemToFind); 
if (result != m_member_A.end()) { 
    // found it! 
} 

Или, если вам нужно разыменования указателя:

auto result = std::find_if(m_member_A.begin(), m_member_A.end(), 
    [] (B* item) { 
    if (item == nullptr) return false; // may want to do something else here 
    return *item == someValue; 
    }); 
if (result != m_member_A.end()) { 
    // found it! 
} 

Демо: http://ideone.com/jKCrG5

+0

Если я почерплю указатель, я останусь с объектом. Что означает «поиск» объекта? (так как я не перегружал оператор сравнения) – ontherocks

+0

@ontherocks Вам нужно будет реализовать критерии самостоятельно в лямбда и вернуть true, когда это будет выполнено. –

1

Если вы хотите сравнить значения вместо сравнения указателей , вы можете использовать std :: find_if вместо:

bool IsFoo (B* _item) { 
    bool result = false; 

    if (_item != nullptr && _item->value == 1) //Whatever is your criteria 
     result = true; 

    return result; 
} 

std::vector<B*> m_member_A; 
B* instance = std::find_if (m_member_A.begin(), m_member_A.end(), IsFoo); 
+0

@ Jarod42 True .. Это было сделано как быстрый пример, а не как копировать и вставлять вид решения, я все равно его обновлю. – Pedrom

Смежные вопросы