2016-08-08 6 views
5

Есть ли разница в производительности/безопасных мудро проверяющие векторных элементов с использованиемПоиск станда :: вектор объектов класса атрибут класса (имя, например.)

  1. для цикла с итераторы

против .

  1. std: find_if (...)?

1. цикл

// 1. for loop 
for (llvm::SmallVectorImpl<myClass>::const_iterator it = v.begin(); 
    it != v.end(); 
    ++it) { 
    if (it->getName() == Name) { 
     // found element 
     // do smth... 
     break; 
    } 
} 

против

2. станд: find_if

// 2. find if 
llvm::SmallVectorImpl<myClass>::const_iterator it 
    = std::find_if(v.begin(), 
        v.end(), 
        StringCheck<llvm::StringRef>(Name)); 
if (it != v.end()) { 
    // found element 
    // do smth... 
} 

// StringCheck defined in header... 

template <class T> 
struct StringCheck{ 
    StringCheck(const T &s) : s_(s) {} 
    bool operator()(const myClass &obj) const 
    { 
     return obj.getName() == s_; 
    } 
private: 
    const T &s_; 
}; 
+0

Ничего другого «безопасно». Для производительности вам придется ориентироваться. – StoryTeller

+0

В конечном итоге 'std :: find_if' будет перебирать вектор, поэтому я не вижу разницы в производительности. – DimChtz

+0

Там [* может * быть различий в производительности в любом случае.] (Http://stackoverflow.com/a/36988833/4892076). Любая такая разница достаточно мала, чтобы быть преждевременной оптимизацией, если вы на самом деле не определили цикл как тем не менее, и в этом случае вы захотите сделать профилирование самостоятельно. – jaggedSpire

ответ

0

Ваш для цикла продолжается итерация после найдено совпадение. Это может быть хорошей вещью, если возможны несколько совпадений, и вы хотите запустить код для каждого совпадения или плохую вещь, если хотите остановиться после того, как совпадение найдено, и совпадение найдено на ранней стадии в большом контейнере.

+0

В моем случае использования я хочу закончить итерацию после первого матча, поэтому я добавил break; в цикле for. –

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