Сравните два вектора C++
Мне было интересно, есть ли функция для сравнения 2 строковых векторов, чтобы вернуть количество различных (или одинаковых) элементов? Или я должен перебрать их обоих и проверить элемент за элементом.
Благодарю.
3 ответа
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector<string> v3;
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3));
Или, если вы не хотите сортировать:
std::set<string> s1(v1.begin(), v1.end());
std::set<string> s2(v2.begin(), v2.end());
std::vector<string> v3;
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(v3));
Вы можете использовать мультимножество, если в векторе могут быть дубликаты.
Посмотрите на set_difference() и set_intersection (). В обоих случаях вам необходимо предварительно отсортировать контейнеры.
Я не знаю о существующей функции, но написать ее самостоятельно не должно быть слишком большой проблемой.
int compare(const vector<string>& left, const vector<string>& right) {
auto leftIt = left.begin();
auto rightIt = right.begin();
auto diff = 0;
while (leftIt != left.end() && rightIt != right.end()) {
if (*leftIt != *rightIt) {
diff++;
}
leftIt++;
rightIt++;
}
// Account for different length vector instances
if (0 == diff && (leftIt != left.end() || rightIt != right.end())) {
diff = 1;
}
return diff;
}
Заметки
- Пропущено
std::
префикс для краткости - Эта функция должна быть обновлена, если она должна обрабатывать
vector<string>
экземпляры разной длины
if (vector1 == vector2)
{
DoSomething();
}
Контент будет сравниваться из обоих векторов согласно приведенной ниже документации по ссылке:
Сравнивает содержимое двух векторов.
1-2) Проверяет, равны ли содержимое lhs и rhs, то есть они имеют одинаковое количество элементов, и каждый элемент в lhs сравнивается как равный с элементом в rhs в той же позиции.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp