سؤال

لقد حصلت على std::list< std::pair<std::string,double> >, ، وهو ما أعرف أنه تم فرزه وفقًا لـ std::string element.

لأنني أرغب في القيام بالكثير من std::find_if على أساس std::string العنصر ، أعتقد أ std::map<string,double,MyOwnBinaryPredicate> مع lower_bound و upper_bound سيكون أكثر ملاءمة.

الحقيقة هي أنني أريد ذلك insert عناصر في std::map بطريقة فعالة. لذلك أريد استخدام جهاز تكرار إضافي لعمل insert أسرع.

أعتقد أن أسهل طريقة هي استخدام أ const_reverse_iterator للذهاب من خلال std::list واستخدام begin() التابع std::map.

هل ستفعل ذلك بهذه الطريقة أم أنها فكرة سيئة؟

شكرًا!

هل كانت مفيدة؟

المحلول

إذا كان لديك بالفعل قائمة مرتبة ، يتم فرزها وفقًا للمسند Predicate, ، يمكنك فقط القيام بما يلي:

std::list< std::pair<std::string, double> > sorted_list;
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end());

ال map يحتوي المنشئ على تعقيد الوقت الخطي إذا تم فرز قائمتك بالفعل ، O (n*log n) خلاف ذلك. يمكنك بعد ذلك العمل مباشرة مع الخريطة كما تفعل مع أي شيء آخر.

إذا كنت تريد لاحقًا إعادة النتائج في قائمتك ، فيمكنك القيام بالعكس:

sorted_list.assign(map.begin(), map.end());

نصائح أخرى

يمكنك استخدام STD :: copy و std :: inserter:

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));  

لأن التكرار لقائمة <Air> لديه نوع قيمة متوافق لخريطة خريطة <x ، y>.

أود فقط التكرار في القائمة وأدخل كل زوج في خريطة أو استخدم طريقة أنيقة لوثر بليسيت وصفها.
حقيقة أنني لا أحصل على ما تحاول القيام به يعني أنه سيؤدي إما إلى رمز غير قابل للقراءة أو أنك في طريقك.
لماذا تفعل ذلك بهذه الطريقة؟
هل يمكنك تغيير الرمز لإرجاع الخريطة إليك بدلاً من القائمة في المقام الأول؟

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