C ++ STL: خريطة البحث عن طريق مكرر لخريطة أخرى

StackOverflow https://stackoverflow.com/questions/1635664

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أحاول القفز من خلال بعض الأطواق لتنظيم البيانات بطريقة خاصة. أنا بما في ذلك قطعة مبسطة من التعليمات البرمجية الذي يوضح ألمي.

وأنا لا يمكن استخدام دفعة. أنا باستخدام أحدث نسخة من ز ++ في سيغوين.

#include <iostream>
#include <map>

using namespace std;

int main () {

    map< int,int > genmap;
    map< int,int >::iterator genmapit;
    map< map<int,int>::iterator,int > itermap;

    // insert something into genmap
    genmap.insert (make_pair(1,500) );

    // find and return iterator.
    genmapit=genmap.find(1);

    // insert the iterator/int into itermap. Dies on each of the following 3 versions of this line.
    //itermap[genmapit] = 600; // crash
    //itermap.insert ( pair< map<int,int>::iterator,int >(genmapit,600) ); // crash
    itermap.insert ( make_pair(genmapit,600) ); // crash

    return 0;
}

وهكذا كما ترون، لدي 1 خريطة بسيطة، مكرر لتلك الخريطة وخريطة أخرى لديها الوسيطة الأولى كما مكرر إلى الخريطة الأولى.

من الواضح من هذا: لماذا لا يمكنني وضع مكرر في الخريطة؟ أنني يمكن أن يكون مكرر كما الوسيطة الثانية. ومع ذلك، فإن الطريقة هو مبين أعلاه توفر هذه:

$ make
g++    -c -o main.o main.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In member fun
ction `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp =
 std::_Rb_tree_iterator<std::pair<const int, int> >]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_tree.h:871:   instantiate
d from `std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _All
oc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::i
nsert_unique(const _Val&) [with _Key = std::_Rb_tree_iterator<std::pair<const in
t, int> >, _Val = std::pair<const std::_Rb_tree_iterator<std::pair<const int, in
t> >, int>, _KeyOfValue = std::_Select1st<std::pair<const std::_Rb_tree_iterator
<std::pair<const int, int> >, int> >, _Compare = std::less<std::_Rb_tree_iterato
r<std::pair<const int, int> > >, _Alloc = std::allocator<std::pair<const std::_R
b_tree_iterator<std::pair<const int, int> >, int> >]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_map.h:360:   instantiated
 from `std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_
Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, bool> std::
map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [wit
h _Key = std::_Rb_tree_iterator<std::pair<const int, int> >, _Tp = int, _Compare
 = std::less<std::_Rb_tree_iterator<std::pair<const int, int> > >, _Alloc = std:
:allocator<std::pair<const std::_Rb_tree_iterator<std::pair<const int, int> >, i
nt> >]'
main.cpp:23:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no
 match for 'operator<' in '__x < __y'
make: *** [main.o] Error 1

"مثيل من هنا" يقول لي شيئا، والبحث على شبكة الإنترنت يعطيني أي معلومات في هذا الشأن.

هل STL: خريطة ببساطة لن تسمح لهذا؟ يمكنني إعادة رمز التطبيق الخاص بي كمحاولة للتغلب على هذه ولكنها ستكون غير فعالة للغاية وأود أن الحصول على هذا العمل. هناك نوع آخر من مؤشر أستطيع أن تجعل لعنصر خريطة أتمكن من استخدام؟

وشكرا على وقتك.

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

المحلول

وأنت لا تستطيع أن تفعل هذا لالمكررات std::map هي المكررات الوصول يست عشوائية بحيث لا يمكن مقارنتها مع <.

وبدلا من ذلك، يمكن استخدام المؤشرات إلى VALUE_TYPE في أول خريطة كمفتاح خريطة.

نصائح أخرى

وعليك أن تتعلم لقراءة رسائل الخطأ. في نظرة خاصة في الرسالة التي تأتي بعد الشرح الطويل ينضب <م> حيث حدث خطأ:

<اقتباس فقرة>   

و/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'

والمكررات خريطة غير قابلة للمقارنة مع أقل من المشغل الذي يستخدم الخريطة افتراضيا.

وأفترض أنك يمكن أن توفر وظيفة مقارنة أن يقارن أشارت أزواج عليه مكرر، منذ المكررات أنفسهم لا يمكن مقارنتها بسهولة بطريقة ذات معنى.

struct CompareIterator
{
     template <class FirstIter, class SecondIter>
     bool operator()(FirstIter lhv, SecondIter rhv) const
     {
         return *lhv < *rhv;
     }
};

//usage with map:
map< map<int,int>::iterator,int, CompareIterator > itermap;

وstd::pair يعرف operator<. أود أيضا أن تستخدم نوعين مكرر، لأنه قد يكون من الممكن أنواع مختلفة (iterator وconst_iterator)

map<Key, Value>

ووmap iterator كعنصر رئيسي في map آخر غير ممكن بسبب map تتوقع operator < يحدده الافتراضية إلى المفتاح. إذا لم يتم تعريف Key (في هذه الحالة map iterator) ثم تحتاج إلى تمرير functor بوصفها وظيفة المسند التي توفر المقارنة بين مفتاح (خريطة مكرر).

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