خوارزميات STL وconst_iterators
سؤال
واليوم كتبت المسند صغيرة للعثور على مطابقة الرموز في وعاء.
ولكن أنا واجهت لمشكلة: أريد استخدام هذا المسند في مكالمة std::find_if
داخل CONST-طريقة فئة، والبحث في الحاوية التي هي عضو في هذه الفئة
ولكن أنا فقط لاحظت أنه لا std::find
ولا std::find_if
هي قادرة على العمل على const_iterators
!
وراجعت على مراجع بعض C ++، ويبدو أن هناك أي نسخة من std::find
أو std::find_if
التي تقبل / عودة const_iterators
. أنا فقط لا يمكن أن نفهم لماذا، لأن من ما رأيت، لا توجد وسيلة أن هذه الخوارزميات يمكن تعديل الكائن المشار إليه بواسطة مكرر.
وهنا هو كيف تم توثيقه std::find
في تنفيذ SGI:
وإرجاع مكرر الأولى التي في تتراوح [أولا، آخر) بحيث * ط == القيمة. يعود آخر إذا لم يكن مثل يوجد مكرر.
اقتباس فقرة>المحلول
وstd::find
وstd::find_if
يمكن أن تعمل بالتأكيد على *::const_iterator
للحاوية معينة. هل من قبيل الصدفة النظر في توقيع تلك الوظائف، وسوء فهم لهم؟
template <class InputIterator, class Type>
InputIterator find(InputIterator first, InputIterator last, const Type& val);
ملحوظة أن InputIterator
هنا هو مجرد اسم المعلمة نوع القالب، وأي const_iterator
تلبية متطلبات لذلك.
وأو، ربما، كنت الخلط const_iterator
(أي مكرر الرجوع إلى قيمة CONST) مع مكرر const
(أي مكرر الذي هو في حد ذاته const
)؟
نصائح أخرى
وstd::find
وstd::find_if
كلا اتخاذ نوع مكرر كمعلمة قالب، لذلك هم بالتأكيد <م> يمكن م> تعمل على const_iterators
. لمجرد مثال سريع:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> x;
std::fill_n(std::back_inserter(x), 20, 2);
x.push_back(3);
std::vector<int>::const_iterator b = x.begin();
std::vector<int>::const_iterator e = x.end();
std::vector<int>::const_iterator p = std::find(b, e, 3);
std::cout << *p << " found at position: " << std::distance(b, p) << "\n";
return 0;
}
وينبغي قبول ذلك عن طريق أي مترجم C ++ يعمل بشكل صحيح، ونتائج مثل:
و3 الموجودة في الموقف: 20
ولقد كان مجرد نفس المشكلة. كان لي وظيفة الأعضاء التي كان يدعو find_if
على ناقلات الأعضاء، وأعطاني المترجم خطأ عندما حاولت جعل const
دالة عضو. واتضح أن هذا كان لأنني كنت تعيين القيمة عودة find_if
إلى iterator
بدلا من const_iterator
. وتسبب المترجم لنفترض أن المعلمات من find_if
يجب أيضا iterator
بدلا من const_iterator
، التي لا يمكن الحصول عليها من ناقلات عضوا const
.
إذا قبل أي فرصة كنت هنا لنفس السبب لي:
error: no matching function for call to ‘find(std::vector<int>::const_iterator, std::vector<int>::const_iterator, int)’
وأنه ليس لديه أي علاقة مع const_iterator
s. ربما كنت قد نسيت فقط ل#include <algorithm>
: -)
وكان لي مجرد قضية مع هذا الرمز:
std::string str;
std::string::const_iterator start = str.begin();
std::string::const_iterator match = std::find(start, str.end(), 'x');
وكان الخطأ "لا الزائد مطابقة للالأمراض المنقولة جنسيا :: العثور على".
وكان الإصلاح وكنت بحاجة إلى استخدام cend (). انها مربكة أن cbegin () غير مطلوب، وأنا لست متأكدا من السبب في أن التحويل بخير (ضمنا) وليس في نهاية () كمعلمة وظيفة.