Использование итератора с одной карты в качестве типа ключа для другой

У меня есть приложение Visual Studio 2008 C ++ 03, где я хотел бы создать std::map который использует итератор из другого std::map как его тип ключа. Но я сталкиваюсь с проблемой, когда пытаюсь стереть элемент с этой карты, используя его тип ключа.

В этом примере, когда элемент в MyList возраст более 5 минут, таймер должен сработать, удалить его с карты и уничтожить таймер старения.

typedef std::map< Foo, FooBar > MyList;
typedef std::map< MyList::iterator, boost::shared_ptr< Timer > > MyListAgeTimers;

class A
{
public:

void AddItem( Foo& f, FooBar& fb )
{
CriticalSection::Guard g( lock_ );
std::pair< MyList::iterator, bool > new_foo =
my_list_.insert( std::make_pair( f, fb ) );
if( new_foo.second )
{
timers_.insert( std::make_pair(
new_foo.first,
boost::make_shared< Timer >( FiveMinutes, boost::bind( &A::OnAgeTimer, this, new_foo.first ) ) ) );
}
};

void OnAgeTimer( MyList::iterator item )
{
CriticalSection::Guard g( lock_ );

// erase by key-type generates an error:
// functional(143) : error C2676: binary '<' : 'const std::_Tree<_Traits>::iterator' does not define this operator or a conversion to a type acceptable to the predefined operator
timers_.erase( item );

// erase by iterator. works okay.
my_list_.erase( item );
};

private:
MyList my_list_;
MyListAgeTimers timers_;
CriticalSection lock_;
};

Разве вы не можете использовать итератор от одной карты в качестве типа ключа для другой? Или мне нужно определить специализированный operator< за это?

РЕДАКТИРОВАТЬ:

Очевидная вещь, которую нужно сделать (для меня), заключается в следующем:

namespace std {
inline bool operator <( const MyList::iterator& a, const MyList::iterator& b )
{
return a->first < b->first;
}
};

Но, если это правильно, почему это не поведение по умолчанию для std::operator< при сравнении двух итераторов?

1

Решение

std::map<key, value> требует, чтобы key есть operator<; это то, что объект карты использует, чтобы найти соответствующий ключ. std::map<x, y>::iterator это двунаправленный итератор; у него нет operator<, поэтому вы не можете использовать его в качестве типа ключа на другой карте, если вы не предоставите свой собственный operator< или функциональный объект для сравнения двух итераторов и определения, какой из них предшествует другому.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]