سؤال

واليوم كتبت المسند صغيرة للعثور على مطابقة الرموز في وعاء.

ولكن أنا واجهت لمشكلة: أريد استخدام هذا المسند في مكالمة 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_iterators. ربما كنت قد نسيت فقط ل#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 () غير مطلوب، وأنا لست متأكدا من السبب في أن التحويل بخير (ضمنا) وليس في نهاية () كمعلمة وظيفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top