Мапированный вектор
От: Hard_Club  
Дата: 07.05.07 09:37
Оценка:
Кто-нибудь слышал о классе, в котором сочетается и map, и vector. Можно обращаться к єлементам как через индексы так и по ключу.
Re: Мапированный вектор
От: Bell Россия  
Дата: 07.05.07 09:40
Оценка: +1
Здравствуйте, Hard_Club, Вы писали:

H_C>Кто-нибудь слышал о классе, в котором сочетается и map, и vector. Можно обращаться к єлементам как через индексы так и по ключу.


Сортированный вектор. Для обращения по ключу используется std::lower_bound.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Мапированный вектор
От: Hard_Club  
Дата: 07.05.07 09:55
Оценка:
Нет, мне нужно обращаться к элементу по двум ключам независимо, и получать по одному из ключей другой ключ.
Re[3]: Мапированный вектор
От: Bell Россия  
Дата: 07.05.07 10:00
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Нет, мне нужно обращаться к элементу по двум ключам независимо, и получать по одному из ключей другой ключ.


И что?
По индексу находми элемент, из элемента ключ (если элемент не содержит ключа, то в векторе можно хранить пару ключ-значени)
По ключу с помощью std::lower_bound находим итератор, далее с помощью std::distance находим индекс


Если это опять не то, то сформулируй задачу попдробнее.
Любите книгу — источник знаний (с) М.Горький
Re: Мапированный вектор
От: IROV..  
Дата: 07.05.07 10:46
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Кто-нибудь слышал о классе, в котором сочетается и map, и vector. Можно обращаться к єлементам как через индексы так и по ключу.


если не важна скорость то можеш использовать метод по типу такого.


template<class T>
typename T::iterator map_index( T &m, size_t i )
{
    if( i >= m.size() || i < 0 )
    {
        return m.end();
    }

    typename T::iterator it = m.begin();
    while( i != 0 )
    { 
        --i;
        ++it;
    }

    return it;
}


А если нужна скорость, и не важен порядок включения в vector елементов то можеш заюзать вот такой вот солюшен.

P.S. написал за 10-15 мин. но мысль ясна

#    include <vector>
#    include <map>

template<class Key, class Value>
class vector_map
{
    typedef std::map< Key, size_t > TMapIterator;
    typedef std::pair< Value, typename TMapIterator::iterator > TPairCash;
    typedef std::vector< TPairCash > TVectorCash;


public:
    void insert( const Key & _key, const Value & _value )
    {
        TMapIterator::iterator it_insert = 
            map_.insert( std::make_pair( _key, 0 ) ).first;

        size_t size = cash_.size();
        cash_.push_back( std::make_pair( _value, it_insert ) );        
        it_insert->second = size;        
    }

    Value & operator [] ( size_t i )
    {
        return cash_[ i ].first;
    }

    const Value & operator [] ( size_t i ) const
    {
        return cash_[ i ].first;
    }

    const Value & find( const Key & _key ) const
    {
        const TMapIterator::iterator it_find = map_.find( _key );
        if( it_find == map_.end() )
        {
            return cash_.end();
        }
        return cash_[ it_find->second ].first;
    }

    void erase( const Key & _key )
    {
        TMapIterator::iterator it_find = map_.find( _key );
        if( it_find == map_.end() )
        {
            return;
        }

        size_t index = it_find->second;
        
        TPairCash & pc = cash_.back();
        pc.second->second = index;
        cash_[ index ] = pc;
        cash_.pop_back();
    }

private:
    TVectorCash cash_;
    TMapIterator map_;
};
я не волшебник, я только учусь!
Re: Мапированный вектор
От: Trotter Россия http://www.e-poison.com
Дата: 07.05.07 10:50
Оценка: +1
Здравствуйте, Hard_Club, Вы писали:

H_C>Кто-нибудь слышал о классе, в котором сочетается и map, и vector. Можно обращаться к єлементам как через индексы так и по ключу.


boost::multi_index ?
Re[2]: Мапированный вектор
От: Zigmar Израиль  
Дата: 07.05.07 23:35
Оценка:
Здравствуйте, Trotter, Вы писали:

T>Здравствуйте, Hard_Club, Вы писали:


H_C>>Кто-нибудь слышал о классе, в котором сочетается и map, и vector. Можно обращаться к єлементам как через индексы так и по ключу.


T>boost::multi_index ?

boost::bimap ?
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.