نسخة بديلة من Find_if التي يجد كل شيء ، وليس فقط الأول؟

StackOverflow https://stackoverflow.com/questions/2344673

  •  23-09-2019
  •  | 
  •  

سؤال

هل هناك نسخة بديلة من std::find_if هذا يعيد جهاز التكرار على جميع العناصر التي تم العثور عليها ، بدلاً من العناوين الأولى فقط؟

مثال:

bool IsOdd (int i) {
  return ((i % 2) == 1);
}

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);

std::vector<int>::iterator it = find_if(v.begin(), v.end(), IsOdd);
for(; it != v.end(); ++it) {
  std::cout << "odd: " << *it << std::endl;
}
هل كانت مفيدة؟

المحلول

يمكنك فقط استخدام أ for عقدة:

for (std::vector<int>:iterator it = std::find_if(v.begin(), v.end(), IsOdd);
     it != v.end();
     it = std::find_if(++it, v.end(), IsOdd))
{
    // ...
}

بدلاً من ذلك ، يمكنك وضع حالتك وإجراءك في functor (تنفيذ الإجراء فقط إذا كان الشرط صحيحًا) والاستخدام فقط std::foreach.

نصائح أخرى

في STL ، لا يوجد ، ولكن Boost يوفر هذه funcionality:

Boost :: الخوارزمية :: find_all

أولاً ، حاول دائمًا التوصل إلى استخدام STL النموذجي نفسه ، يمكنك الذهاب إلى Boost أيضًا. فيما يلي شكل أكثر بساطة من الإجابة المذكورة أعلاه من قبل تشارلز.

    vec_loc = find_if(v3.begin(), v3.end(), isOdd);
if (vec_loc != v3.end())
{
    cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
    ++vec_loc;
}
for (;vec_loc != v3.end();vec_loc++) 
{
    vec_loc = find_if(vec_loc, v3.end(), isOdd);
    if (vec_loc == v3.end())
        break;
    cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top