2014-01-16 3 views
0

Так что я хочу выполнить некоторую проверку ошибок на векторе, который у меня есть в классе, чтобы увидеть, существует ли элемент, прежде чем добавлять новый элемент в вектор.Проверка того, что элемент уже находится в векторе

ClassA каст

void ClassA::func(std::shared_ptr<ClassB> new_item) 
{ 
    for(auto items : vector_) 
    { 
     if(items = new_item) 
     { 
      return; 
     } 
     vector_.push_back(new_item); 
    } 
} 

vector_ является членом класса члена станд :: вектор. В этой текущей реализации все new_item игнорируются, даже если это не дубликат. Я знаю, что «if (items = new_item)» является проблематичной линией, но я не знаю почему.

+2

Сначала попробуйте '==' вместо '='. Затем взгляните на 'std :: find'. – juanchopanza

+1

Возможный дубликат [Назначение переменной в условии «если»] (http://stackoverflow.com/questions/17681535/variable-assignment-in-if-condition) – Nemo

+2

Не имеет ли это неопределенного поведения, поскольку 'push_back' может перераспределять и тогда итераторы, используемые циклом, основанным на диапазоне, будут недействительными? Не говоря уже о том, что он будет добавлять новый элемент много раз. –

ответ

6

Вы назначая вместо сравнения равенства здесь:

if(items = new_item) // assigns value of new_item to items 

Такого рода проблемы легко избежать, используя хорошо проверенные стандартные библиотечные функции, такие как std::find:

#include <algorithm> // for std::find 
.... 
if (find(vector_.begin(), vector_.end(), newitem) == vector_.end()) 
    vector_.push_back(newitem); 
0

= присваиванию

== равенство

Вы хотите

if(items == new_item) 
    { 
     return; 
    } 
2

У вас есть опечатка:

if(items = new_item) 

должен быть

if (items == new_item) 

Btw вы можете написать

if (std::find(std::begin(vector_), std::end(vector_), new_item) == std::end(vector_) { 
    vector_.push_back(new_item); 
} 

или использовать std::set

0

Это то, что вам нужно:

void ClassA::func(std::shared_ptr<ClassB> new_item) 
{ 
    for(auto items : vector_) 
    { 
     if(items == new_item) 
     { 
      return; 
     }    
    } 

    vector_.push_back(new_item); 
} 

Обратите внимание, что вам нужно ==, а что =. Кроме того, ваш код добавлял new_item к вектору на каждой итерации. Теперь это просто сделано, если элемент не найден.

+0

Возможно, вам также захочется сделать 'auto const &'. – 0x499602D2

+0

Ему нужен 'if (std :: find (vector_.begin(), vector_end(), new_item) == vector_.end()) {vector_.push_back (new_item); } '. Нет смысла переопределять то, что уже есть в стандартной библиотеке. (То, что ему также нужно, - это другое соглашение об именах. Подчеркивает, что ведущие или конечные символы просто плохие.) –

+0

@JamesKanze - да, но я пытаюсь показать, что не так с кодом – Sean

0

Вы используете

if(items = new_item) 
    { 
     return; 
    } 

значение new_item присваивается элементам как "= "является оператором присваивания и любым положительным значением if, если условие будет истинным. Вам необходимо использовать оператор «==» для сравнения

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