2013-03-22 4 views
1

Это правильный способ разыменовать последний элемент в диапазоне?Dereference относительно конечного итератора

std::string getName(Foos::const_iterator& begin, Foos::const_iterator& end) 
{ 
    return boost::apply_visitor(Detail::NameGetterForFoo(),*--end); 
} 

Предполагая, что у меня всегда есть что-то в векторе.

+0

Вы знаете, что '--end' изменяет итератор' end', правильно? Это не то же самое, что '* (end-1)' –

+3

Обратите внимание, что это уменьшит исходный итератор. Вы можете перейти по значению или использовать '* std :: prev (end)'. –

ответ

0

Если у вас всегда есть что-то в контейнере, используйте std :: prev на конце, чтобы получить итератор перед ним, а затем уменьшите это. Вот как я бы написать блок кода:

std::string getName(Foos::const_iterator begin, Foos::const_iterator end) 
{ 
    // Assert: begin != end. 
    return boost::apply_visitor(Detail::NameGetterForFoo(),*std::prev(end)); 
} 

Edit: также контейнеры поддерживают функцию члена .Задняя(), а также. Если вы перейдете в свой контейнер вместо диапазона итератора, вы можете использовать его вместо этого. Это может быть полезно, поскольку в этом блоке кода все, что вам действительно нужно, это последний элемент контейнера. например

std::string getName(Foos const& foos) 
{ 
    // Assume Foos is a standard container with front() and back() and that 
    // it is non-empty. 
    return boost::apply_visitor(Detail::NameGetterForFoo(), foos.back()); 
}