С http://www.cplusplus.com/reference/stl/set/set/
vector<int> numbers;
for (int i=2; i<=2000000; ++i)
numbers.push_back(i);
set<int> primes(numbers.begin(), numbers.end());
Это должно иметь сложность O (n), где, как у вас, сложность O (n * log (n)).
Ссылочная ссылка говоритчто, когда вы используете конструктор на основе итератора, если итератор отсортирован, вы получаете линейный.Тем не менее, я не вижу ничего явного в том, как явно сообщить конструктору, что это отсортированный итератор.
Для чего-то более чистого я бы предпочел использовать итератор подсчета Boost.Это сокращает это до:
set<int> primes(
boost::counting_iterator<int>(0),
boost::counting_iterator<int>(200000));