У меня есть это:Как сравнить два неслучайный итератор доступа в C++
vector<int> vec = {10, 4, 18, 7, 2, 10, 25, 30};
auto& pos25 = find(vec.cbegin(), vec.cend(), 25);
auto& pos18 = find(vec.cbegin(), vec.cend(), 18);
Теперь я хочу, чтобы сделать запрос для поиска между там две позиции. Я могу просто использовать operator<
между pos25
и pos18
, так как они случайные итераторы acess, а затем я могу find
местоположение в этом диапазоне.
Но что делать, если мой контейнер является forward_list
. Как это реализовать, поскольку у меня нет operator<
для сравнения этих двух итераторов; поэтому я не могу знать, произойдут ли сначала pos25
или pos18
, чтобы дать диапазон функции find
.
Я нашел этот метод в книге:
pos18 = find (vec.begin(), vec.end(), // range
18); // value
pos25 = find (vec.begin(), pos18, // range
25); // value
if (pos18 != coll.end() && pos25 != pos18) {
// pos25 is in front of pos18
// so, only [pos25,pos18) is valid
...
}
else {
pos25 = find (pos25, vec.end(), // range
25); // value
if (pos25 != coll.end()) {
// pos18 is in front of pos25
// so, only [pos18,pos25) is valid
...
}
else {
// 18 and/or 25 not found
...
}
}
Хотя это достаточно просто, есть что-нибудь более эффективным?
Это утомительно сложно, но вы не будете бить его эффективность - это находит 'pos18' пути поиска через целого вектора, тогда он находит 'pos25', сначала ищет от' begin' до 'pos18', а затем от' pos18' до 'end' - поэтому он является оптимальным. Я не думаю, что вы можете сделать лучше. –
@MartinBonner Это выглядит несколько раз, поэтому вы можете * определенно * побить его для эффективности, см. [Мой ответ] (http://stackoverflow.com/a/41143158/2642059). –
@JonathanMee: Ах, ха! Я думал об эффективности с точки зрения «количества сравнений», а не «количества итераций», которые я обычно считаю «дешевыми», но вы правы. В случае связанного списка это плохая интуиция. –