Вы должны передать вектор по ссылке, чтобы избежать многократных копий, поэтому итератор гарантированно будет сравниваться с итераторами одного и того же вектора, а не с другими:
void print(const std::vector<int>& ivec, std::vector<int>::const_iterator it) {
if (it == ivec.end())
return;
std::cout << *it++ << std::endl;
print(ivec, it);
}
int main(){
vector<int> v{
5, 7, 77, 23, 10, 81
};
print(v, v.begin()); // ok
vector<int>::iterator it = v.begin();
auto v2{ v };
if (it == v.begin())
cout << "it = v.begin()" << endl;
if (it == v2.begin()) // causes crash
cout << "it =v2.begin()" << endl;
}
Вот другой ответ, который не делает то, что Вы хотите также, но можете быть полезными.
C-x v g
выполняет команду vc-annotate
.
Это откроется новый буфер (я знаю, Вы не хотели один), но это будет иметь все строки отмеченными с тем, кто коснулся их когда. И, премия, они - цвет, кодированный с heatmap (красный, ново, синий меньше всего), для легкой идентификации недавних изменений.
Конечно, встроенная версия vc-annotate не прокручивает буфер соответственно, таким образом, Вы захотите этот совет:
(defadvice vc-annotate (around vc-annotate-and-scroll)
"scroll buffer to view current line in the annotated buffer"
(let ((pos (count-lines (point-min) (point))))
ad-do-it
(let ((orig-window (selected-window))
(window (other-window-for-scrolling)))
(select-window window)
(goto-line pos)
(select-window orig-window))))
(ad-activate 'vc-annotate)
Вы хотите vc-diff
, который идет C-x v =
по умолчанию. Это дает Вам необработанный различный вывод во временном буфере. Буфер использует различный режим, который имеет несколько аккуратных приемов..., например, можно использовать C-c C-e
применять разность как патч к другому файлу. Использовать describe-mode
(C-h m
по умолчанию) в различном буфере для нахождения других приемов.
Возможно, Вы хотели бы Ediff, который, кажется, делает точно, что Вы хотите.