Если я вас правильно понимаю, вы также хотите, чтобы дубликаты были напечатаны. Это требует лишь небольшого изменения вашего исходного алгоритма. Он помечен комментарием:
#include <algorithm>
#include <iostream>
#include <iterator>
template<typename It, typename value_type = typename std::iterator_traits<It>::value_type>
void pairSum(It begin, It end, const value_type& x) {
if(begin == end) return;
std::sort(begin, end);
std::advance(end, -1);
while(begin < end) {
if(x < *begin + *end) {
std::advance(end, -1);
} else if(*begin + *end < x) {
std::advance(begin, 1);
} else {
std::cout << *begin << " + " << *end << " = " << x << '\n';
// Only step one iterator. If the next value is the same as the currect,
// step that iterator.
if(*begin == *std::next(begin, 1)) std::advance(begin, 1);
else std::advance(end, -1);
}
}
}
int main() {
std::vector<int> v{9, 1, 3, 6, 2, 5, 4, 3, 2, 4, 7};
pairSum(v.begin(), v.end(), 10);
}
Вывод
1 + 9 = 10
3 + 7 = 10
3 + 7 = 10
4 + 6 = 10
4 + 6 = 10