У меня есть некоторые проблемы с этим кодом, код компилируется, но когда я пытаюсь проверить содержимое вектора, тесты не пройдены. Вот код:
using std::vector;
// returns a different vector, containing all elements in v1 and all elements in v2 (elements who are either in v1 or v2) but no duplicates.
template <typename T> vector<T> set_union(const vector<T>& v1, const vector<T>&v2)
{
vector<T> v(20);
typename vector<T>::iterator it;
it = set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), v.begin());
return v;
}
И вот тест, который я запускаю:
TEST_F(MyTest,set_union) {
vector<int> v1{1,3,2};
vector<int> v2{1,4};
vector<int> v=set_union(v1,v2);
ASSERT_EQ(0,count(v,9));
ASSERT_EQ(1,count(v,1));
ASSERT_EQ(1,count(v,2));
ASSERT_EQ(1,count(v,3));
ASSERT_EQ(1,count(v,4));
}
Когда я запускаю эти тесты, первый тест проходит, но второй тест возвращает 0 экземпляров числа 1 в векторе, где ответом должен быть 1 экземпляр.
Проблема в том, что std::set_union
требует сортировки входных данных, которые ваши v1
не является.
РЕДАКТИРОВАТЬ: Как отмечается в комментарии, вы не должны предварительно изменять размер вектора, так как он будет содержать 0, если у вас не будет ровно 20 элементов в объединенном результате. Вместо этого, что-то вроде этого (я изменил имя, чтобы сделать его более информативным, и отредактировал ниндзя в вызове, чтобы зарезервировать минимальный размер на основе комментария):
template <typename T>
std::vector<T> vector_union(const std::vector<T>& v1, const std::vector<T>& v2)
{
vector<T> v;
v.reserve(std::max(v1.size(), v2.size());
set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v));
return v;
}
При желании вы могли бы даже иметь такого рода векторы перед вызовом set_union
но это вызывает ненужную работу для предварительно отсортированных входов.
Других решений пока нет …