Проблема в том, что ваш c
пуст, потому что он был инициализирован без элементов, не говоря уже о ненужном вызове clear()
. std::merge()
принимает выходной итератор в качестве последнего аргумента. Если c.begin()
относится к началу std::vector
, в котором уже содержит достаточно элементов, то это не проблема - эти элементы будут просто перезаписаны. На самом деле вы вызываете неопределенное поведение, записывая значения в память за концом вектора.
Чтобы в c
было достаточно места для элементов, вы можете сделать это:
c.resize(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
Однако более логично использовать std::back_insert_iterator
, выходной итератор, который вызывает push_back()
. Для повышения эффективности вы можете заранее вызвать reserve()
для вектора. Это гарантирует, что c
нужно выделять память только один раз, а не как она увеличивается во время вызова std::merge()
. Окончательное решение выглядит так:
#include <iterator>
// ...
c.reserve(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(c));