Карта STL на себя?

Имейте обзор кода перед каждой фиксацией (даже если это - 1 минута, "я изменил это имя переменной"), и как часть обзора кода, рассмотрите любые модульные тесты.

не заканчивают на фиксации, пока тесты не существуют.

(Также - Если его работа не была протестирована - почему это было в производственной сборке во-первых? Если это не тестируется, не впускайте его, то Вы не должны будете работать выходные)

12
задан genpfault 10 September 2009 в 05:24
поделиться

3 ответа

Вы можете использовать прямое объявление нового типа.

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

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

С этим косвенным обращением компилятор должен позволить вам избежать неприятностей. Это не очень красиво, но, честно говоря, я не думаю, что вы можете легко сломать самореференцию.

14
ответ дан 2 December 2019 в 07:03
поделиться

Не слишком уродливо, учитывая…

Это работает в GCC 4.0.1 и прекрасно компилируется в строгом режиме Comeau.

Определения шаблонов анализируются и откладываются до тех пор, пока они не будут созданы. Компилятор даже не видит, что такое rec_map_iterator, пока не придет время его создать, и к этому времени он уже знает, как это сделать; v).

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;
}
5
ответ дан 2 December 2019 в 07:03
поделиться

В моем предыдущем ответе мне не понравилось извлечение из контейнера, поэтому вот альтернатива:

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 :: t , rec_map_gen :: t :: iterator и т.д., но у вас также есть доступ ко всем конструкторам std :: map . Жаль, что C ++ не позволяет создавать шаблоны typedef.

Использование производного типа итератора должно быть приемлемым. Вы все еще можете инициализировать обратный итератор, например, из элемента этой структуры.

2
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: