سؤال

وأود أن إنشاء std::map التي تحتوي على std::vector من التكرارات في حد ذاته، لتنفيذ بنية بسيطة الرسم البياني القائمة على أساس القوائم الجوار.

ومع ذلك، فإن تعريف النوع ولي الحيرة: يبدو أن كنت في حاجة إلى تعريف خريطة نوع كامل للحصول على نوع مكرر من قال الخريطة، مثل ذلك:

map< int, Something >::iterator MyMap_it;  // what should Something be?
map< int, vector<MyMap_it> > MyMap_t;

هل هناك نوع من الجزئي نوع خريطة مكرر يمكنني الحصول فقط مع نوع المفتاح، حتى أستطيع أن يعلن الخريطة الكاملة؟

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

المحلول

هل يمكن استخدام الأمام إعلان من نوع جديد.

class MapItContainers;
typedef map<int, MapItContainers>::iterator MyMap_it;

class MapItContainers
{
public:
 vector<MyMap_it> vec;
};

ومع هذه المراوغة المترجم يجب أن تسمح لك تفلت من العقاب. أنها ليست كذلك جميلة جدا ولكن بصراحة أنا لا أعتقد أنه يمكنك كسر النفس الرجوع بسهولة.

نصائح أخرى

وليس قبيحا أيضا، النظر ...

وهذا يعمل في دول مجلس التعاون الخليجي 4.0.1 ويجمع ما يرام في وضع صارم كومو.

ويتم تحليل تعريفات قالب والمؤجلة حتى انهم مثيل. المترجم حتى لا نرى ما هو rec_map_iterator حتى حان الوقت لإنشاء واحد، وهو الوقت الذي يعرف كيفية القيام بذلك؛ ت)

template< class key >
struct rec_map;

template< class key >
struct rec_map_iterator : rec_map< key >::iterator {
    rec_map_iterator( typename rec_map< key >::iterator i)
    : rec_map< key >::iterator(i) {}
};

template< class key >
struct rec_map : map< key, vector< rec_map_iterator< key > > > {};

وهنا برنامج اختبار استعملتها.

#include <iostream>
#include <map>
#include <vector>

using namespace std;

template< class key >
struct rec_map;

template< class key >
struct rec_map_iterator : rec_map< key >::iterator {
    rec_map_iterator( typename rec_map< key >::iterator i)
    : rec_map< key >::iterator(i) {}
};

template< class key >
struct rec_map : map< key, vector< rec_map_iterator< key > > > {};

int main( int argc, char ** argv ) {
    rec_map< int > my_map;

    my_map[4];
    my_map[6].push_back( my_map.begin() );

    cerr << my_map[6].front()->first << endl;

    return 0;
}

ولم يعجبني المستمدة من حاوية في إجابتي السابقة حتى هنا هو بديل:

template< class key >
struct rec_map_gen {
    struct i;
    typedef map< key, vector< i > > t;
    struct i : t::iterator {
        i( typename t::iterator v )
        : t::iterator(v) {}
    };
};

والآن لديك لاستخدام rec_map_gen<int>::t، rec_map_gen<int>::t::iterator، الخ، ولكن لديك أيضا إمكانية الوصول إلى الصانعين كل std::map ل. انها سيئة للغاية C ++ لا يسمح typedefs أن قالب.

وعن طريق نوع مكرر المستمدة ينبغي أن يكون موافق. لا يزال بإمكانك تهيئة مكرر العكسي من عنصر من هذه البنية، على سبيل المثال.

وبالإضافة إلى الإجابة Potatoswatter، وإذا كنت لا تمانع في وجود للإشارة إلى كامل قالب نوع الخريطة عدة مرات، تحتاج فقط إلى فئة فرعية مكرر ولا تحتاج إلى أي-الإعلانات قبل:

template<class key>
struct rec_map_iterator : map<key, vector<rec_map_iterator<key> > >::iterator
{
    rec_map_iterator(typename map<key, vector<rec_map_iterator<key> > >::iterator i)
        : map<key, vector<rec_map_iterator<key> > >::iterator(i)
    {}
};

وبعد ذلك استخدام نوع الكامل:

map<int, vector<rec_map_iterator<int>>> m;

وأيضا، وهنا تحديثا (المفضلة حتى الآن) لC ++ 11 بإعلان rec_map كاسم مستعار، والتي يمكن قالب:

template<class key>
struct rec_map_iterator;

template<class key>
using rec_map = map<key, vector<rec_map_iterator<key>>>;

template<class key>
struct rec_map_iterator : rec_map<key>::iterator
{
    rec_map_iterator(typename rec_map<key>::iterator i)
        : rec_map<key>::iterator(i)
    {}
};

وهذا يعمل نفس النسخة Potatoswatter ل:

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