Сравните два вектора C ++ - PullRequest
17 голосов
/ 08 марта 2011

Мне было интересно, есть ли какая-нибудь функция для сравнения 2-х строковых векторов, чтобы вернуть количество разных (или одинаковых) элементов? Или я должен перебрать их обоих и проверить элемент за элементом.
Благодаря.

Ответы [ 3 ]

43 голосов
/ 08 марта 2011
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));

Вы можете использовать мультимножество, если в векторе могут быть дубликаты.

4 голосов
/ 08 марта 2011

Посмотрите на set_difference () и set_intersection () . В обоих случаях вам нужно предварительно отсортировать контейнеры.

4 голосов
/ 08 марта 2011

Я не знаю о существующей функции, но написать ее самостоятельно не должно быть слишком большой проблемой.

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