c ++ set_union итератор

У меня есть некоторые проблемы с этим кодом, код компилируется, но когда я пытаюсь проверить содержимое вектора, тесты не пройдены. Вот код:

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 экземпляр.

3

Решение

Проблема в том, что 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 но это вызывает ненужную работу для предварительно отсортированных входов.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]