获得两个数组之间的差异

时间:2019-10-03 07:51:17

标签: c++ qt

我有2个字符串表,我想显示两个表之间的差异。

示例:

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

在这种情况下的区别是缺少user 1

我想知道是否有一个函数可以让您在标准库或Qt中执行此操作。

谢谢。

3 个答案:

答案 0 :(得分:2)

您需要的是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;
}

答案 1 :(得分:0)

如果您的字符串表存储为您所描述的字符串,即

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;
}

答案 2 :(得分:0)

如果用std::set(或std::unordered_set)显示表格,则可以降低计算复杂度。然后,无需对表进行排序(这不是便宜的操作)。我修改 使用true的{​​{3}}答案:

std::unordered_set