تخطَّ إلى المحتوى

std::find

البحث الخطّي std::find

std::find تبحث عن أول عنصر يطابق قيمة معيّنة ضمن نطاق، بفحص خطّي (O(n)) يعمل مع أي نوع حاوية تقريبًا — حتى غير المرتّبة.

تمرّ std::find على النطاق [begin, end) عنصرًا عنصرًا حتى تجد تطابقًا مع القيمة المطلوبة عبر عامل ==، أو تصل لنهاية النطاق دون إيجاد شيء. تُرجع iterator يشير للعنصر إن وُجد، أو نفس end() إن لم يوجد — لذا الفحص الصحيح دائمًا هو مقارنة الناتج بـ end(). لبحث أسرع (O(log n)) بحاوية مرتّبة، استخدم std::binary_search أو std::lower_bound بدلًا منها.

الصياغة

auto it = std::find(begin, end, value);
if (it != end) { /* وُجد */ }

📄 مثال

#include <algorithm>
#include <vector>

std::vector<std::string> names = {"سارة", "عمر", "ليلى"};
auto it = std::find(names.begin(), names.end(), "عمر");

if (it != names.end()) {
    std::cout << "وُجد بالموضع: " << (it - names.begin()); // 1
} else {
    std::cout << "غير موجود";
}

أهم النقاط

العنصرالوظيفة
std::find(begin, end, value)بحث خطّي عن قيمة محددة، يعمل بأي نطاق مهما كان غير مرتّب
std::find_if(begin, end, predicate)نفس المبدأ، لكن يبحث عن أول عنصر يحقق شرطًا (لامدا) بدل قيمة مطابقة تمامًا
الناتج == end()الطريقة الوحيدة الصحيحة للتحقق من عدم وجود العنصر

💡 نصائح عملية

  • استخدم find_if بدل find كلما احتجت شرطًا مركّبًا (مثل «أول رقم أكبر من 10») بدل مطابقة قيمة واحدة تمامًا
  • لو الحاوية مرتّبة أصلًا وكبيرة الحجم، استخدم std::binary_search أو std::lower_bound لأداء O(log n) بدل O(n)

⚠️ أخطاء شائعة

  • افتراض أن std::find تُرجع -1 أو nullptr عند عدم الإيجاد كلغات أخرى — بـ C++ تُرجع دائمًا end()، ويجب مقارنتها به
  • استخدام find على حاوية غير مرتّبة ثم التساؤل عن بطء الأداء بمجموعة بيانات ضخمة — find خطّية دومًا بلا فرز مسبق

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.