Получить разницу между двумя массивами - PullRequest
0 голосов
/ 03 октября 2019

У меня есть две строковые таблицы, и я хотел бы отобразить различия между двумя таблицами.

Пример:

Tab1 = "user1, user2, user3, user4"
Tab2 = "user3, user4, user2"

Разница в этом случае заключается в том, что user 1 отсутствует.

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

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Вам нужно std::set_difference, которое копирует элементы из отсортированного v1, которые не найдены в отсортированном v2, в diff. Как уже упоминалось, вы должны сначала отсортировать ваши векторы, а затем искать разницу.

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>

int main() {
    std::vector<std::string> v1 { "user1", "user2", "user3", "user4" };
    std::vector<std::string> v2 { "user3", "user4", "user2" };
    std::vector<std::string> diff;

    std::sort(v1.begin(), v1.end()); 
    std::sort(v2.begin(), v2.end()); 
    std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(),
        std::inserter(diff, diff.begin()));

    for (auto const& i : diff)
        std::cout << i << std::endl;
}
0 голосов
/ 03 октября 2019

Вы можете уменьшить вычислительную сложность, если представите таблицы с std :: set (или std :: unordered_set ). Тогда не нужно сортировать таблицы (это не дешевая операция). Я изменяю NutCracker ответ с использованием std::unordered_set:

#include <iostream>
#include <unordered_set>
#include <vector>

int main()
{
  std::unordered_set<std::string> set1{ "user1", "user2", "user3", "user4" };
  std::unordered_set<std::string> set2{ "user3", "user4", "user2", "user8" };
  std::vector<std::string> diff;

  for (const auto& s : set1)
  {
    auto it = set2.find(s);
    if (it == set2.cend())
    {
      diff.emplace_back(s);
    }
  }

  for (const auto& s : set2)
  {
    auto it = set1.find(s);
    if (it == set1.cend())
    {
      diff.emplace_back(s);
    }
  }

  for (const auto& s : diff)
    std::cout << s.c_str() << std::endl;
}
0 голосов
/ 03 октября 2019

Если ваши строковые таблицы хранятся в виде строки, как вы изобразили, то есть

Tab1 = "user1, user2, user3, user4"
Tab2 = "user3, user4, user2"

, то вы можете использовать регулярное выражение, чтобы сначала найти пользователей в Tab1 и сохранить их в наборе. При поиске пользователей в Tab2 вы можете проверить, присутствует ли этот пользователь в наборе, если да, то удалить этого пользователя из набора, если нет, затем вставить этого пользователя в набор.

Код:

#include <iostream>
#include <string>
#include <regex>
#include <set>

using namespace std;

ostream& operator<< (ostream& out, const set<string>& S)
{
    for (const string& s : S)
        out << s << endl;
    return out;
}

int main()
{
    string Tab1 = "user1, user2, user3, user4";
    string Tab2 = "user3, user4, user2";
    regex reg("user[0-9]{1,}");

    set<string> S;
    sregex_iterator pos1(Tab1.cbegin(), Tab1.cend(), reg);
    sregex_iterator end1;
    while (pos1 != end1)
    {
        S.insert(pos1->str());
        ++pos1;
    }
    sregex_iterator pos2(Tab2.cbegin(), Tab2.cend(), reg);
    sregex_iterator end2;
    while (pos2 != end2)
    {
        string temp = pos2->str();
        if (S.find(temp) != S.cend())
            S.erase(temp);
        else
            S.insert(temp);
        ++pos2;
    }
    cout << S << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...