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 الكامل بالعربي.