2009-02-13 4 views
2

Я хотел бы инициализировать карту - объект «ID» с идентичностями от 0 до N-1, т.е.Каков самый простой способ создания карты идентификации STL?

id[0] = 0 
id[1] = 1 
. 
. 
id[n-1] = n-1 

Есть простой способ - это один вкладыш, метод внутри карты-объект , просто что-то действительно простое - что это делает?

ответ

3

Вы можете использовать

template <class InputIterator> 
map(InputIterator f, InputIterator l, 
    const key_compare& comp) 

форму конструктора, но вы должны были бы построить InputIterator, который работал в качестве функции генератора в диапазоне вы хотите. Это было бы намного больше печатать, чем просто использовать цикл for.

5

Что с

for(unsigned int i = 0; i < n; ++i) 
    id[i] = i; 
+0

Я ожидал, что STL предлагает метод, который облегчает эту петлю. – secr

+0

Я нахожу, что STL сделает несколько простых задач более (символами или строками) кода. Это связано с тем, как он разработан, например. используя классы итератора вместо ints, чтобы разрешить итерацию более общего назначения. Лично я избегаю STL для простых задач, код ванили часто быстрее и проще отлаживать. – jheriko

+0

Любой встроенный STL просто разрешит этот цикл под капотом, за исключением целых сгустков клавиш. – Crashworks

3

Это кажется немного странным, чтобы использовать карту с ключом является простым показателем. Вы уверены, что не можете использовать вектор? Делая это, вы могли бы использовать boost::counting_iterator для заполнения вектора:

std::vector<int> v(boost::counting_iterator<int>(0), 
        boost::counting_iterator<int>(N-1)); 
// v is filled with integers from 0 to N-1 

Однако, я не уверен, будет ли это огромный выигрыш по сравнению с простым циклом.

0

Высматривайте станд :: йоту как часть цифровой библиотеки (C++ 0x функция):

template <ForwardIterator Iter, HasPreincrement T> 
requires OutputIterator<Iter, const T&> 
void iota(Iter first, Iter last, T value); 
Смежные вопросы