Вам нужно взглянуть на std::lower_bound
template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
//^^^^^^^^ --> iterator
Это возвращает итератор, указывающий на первый элемент в диапазоне [first, last) , которое не меньше (то есть больше или равно) значению, или последнее, если такой элемент не найден.
То есть вы будете разыменовывать итератор (то есть " указатель с начала std::lower_bound
", который называется разыменование , а не указатель ), чтобы получить элемент подчеркивания, и если вам понадобится итератор для дальнейших операций, вы не будете разыменовывать Это.
В вашем случае i.second
имеет тип std::vector<int>
и выполнение
std::lower_bound(i.second.begin(),i.second.end(), prev_ind);
возвращает std::vector<int>::iterator
, указывающее на элемент согласно условию. Если вам нужен доступ к элементу, вам нужно разыменовать его.
std::vector<int>::iterator iter_prev_ind = std::lower_bound(i.second.begin(),i.second.end(), prev_ind);
prev_ind = *iter_prev_ind ;
, что вкратце означает то, что вы написали
prev_ind = *std::lower_bound(i.second.begin(),i.second.end(),prev_ind);
Тем не менее, вы должны быть осторожны перед разыменованием итератор возвращает std::lower_bound
, поскольку он также может быть конечным итератором, если такой элемент не найден в диапазоне [первый, последний) (кредиты @ eerorika ).
if(auto iter_prev_ind = std::lower_bound(i.second.begin(),i.second.end(),prev_ind);
iter_prev_ind != i.second.end()) // if not iterator end
prev_ind = *iter_prev_ind ;
Также обратите внимание на следующее