Ваш код трудно читать, потому что вы объявляете переменные там, где они не используются. Поэтому их значения трудно понять.
Также нет необходимости удалять элементы из вектора. Найти значение, которое является первым, которое встречается k-раз, не эквивалентно изменению вектора. Это две разные задачи.
Я могу предложить следующее решение, показанное в демонстрационной программе ниже.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 1, 1, 2, 3, 4, 4, 2, 2, 1, 3 };
size_t least_last = v.size();
size_t k = 3;
for ( size_t i = 0; i + k <= least_last; i++ )
{
size_t count = 1;
size_t j = i;
while ( count < k && ++j < least_last )
{
if ( v[j] == v[i] ) ++count;
}
if ( count == k )
{
least_last = j;
}
}
if ( least_last != v.size() ) std::cout << v[least_last] << '\n';
return 0;
}.
Вывод программы:
2
Идея состоит в том, найти последнюю позицию первого элемента, встречающегося k раз. Как только он будет найден, верхний предел пройденной последовательности будет установлен на это значение. Таким образом, если есть другой элемент, который встречается k раз перед этим пределом, то это означает, что он встречается первым по сравнению с уже найденным элементом.