كيفية تحويل std :: قائمة std :: زوج إلى std :: خريطة
سؤال
لقد حصلت على 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>.
أود فقط التكرار في القائمة وأدخل كل زوج في خريطة أو استخدم طريقة أنيقة لوثر بليسيت وصفها.
حقيقة أنني لا أحصل على ما تحاول القيام به يعني أنه سيؤدي إما إلى رمز غير قابل للقراءة أو أنك في طريقك.
لماذا تفعل ذلك بهذه الطريقة؟
هل يمكنك تغيير الرمز لإرجاع الخريطة إليك بدلاً من القائمة في المقام الأول؟