У меня есть некоторый код, который выглядит следующим образом:std :: inserter with set - insert to begin() или end()?
std::set<int> s1, s2, out;
// ... s1 and s2 are populated ...
std::set_intersection(s1.begin(), s1.end(),
s2.begin(), s2.end(),
std::inserter(out, out.end()));
Я прочитал вставки может быть сделана в амортизационном постоянная время, если значение вставляется в набор непосредственно следует итератор задается как «намек». Это, очевидно, было бы полезно при запуске набора пересечений, тем более, что все, записанное в out
, уже находится в отсортированном порядке.
Как я могу гарантировать эту оптимальную производительность? При создании std::inserter
out
пуст, поэтому out.begin() == out.end()
, поэтому я не вижу, имеет значение, укажу ли я out.begin()
или out.end()
в качестве подсказки. Однако, если это интерпретируется при вставке каждого элемента в begin()
, похоже, что я бы не получил оптимальную алгоритмическую производительность. Можно ли это сделать лучше?
@Ahsleys: По крайней мере, выбирая 'end', вы не пессимизируете алгоритм, так как не существует следующего элемента (таким образом экономя одно сравнение). Однако я задаюсь вопросом (как и вы), если итератор, который вы проходите, действительно будет развиваться или застревать в начале/конце. –