Удалить дубликаты из 3 векторов - PullRequest
2 голосов
/ 05 ноября 2019

У меня проблема в C ++. Допустим, у меня есть 3 вектора (не берите в голову неправильное определение, просто пример)

a = {"a", "b"}, b = {"b", "c"}, c = {"b", "c"}

Как я могу наиболее быстро и эффективно удалить все дубликаты из них, поэтому результат будет следующим. В одном векторе нет дубликатов, и вектор не сортируется по алфавиту.

a = {"a"}, b = {}, c = {}

Редактировать: я пробовал это:

for (int i = 0; i < a.size(); i++)
    {
        int i1 = findIndex(b, a[i]);
        int i2 = findIndex(c, a[i]);
        if (i1 != -1)
        {
            a.erase(a.begin() + i);
            b.erase(b.begin() + i1);
        }

        if (i2 != -1)
        {
            a.erase(a.begin() + i);
            c.erase(b.begin() + i2);
        }
}

, где findIndex:

int findIndex(vector<string> vec, string s)
{
    for (int i = 0; i < vec.size(); i++)
    {
        if (vec[i] == s)
        {
            return i;
        }
    }

    return -1;
}

1 Ответ

2 голосов
/ 05 ноября 2019
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <string>

void RemoveDuplicates(std::vector<std::vector<std::string>> &vectors)
{
    std::unordered_map<std::string, int> count;

    for (auto& vec : vectors)
    {
        for (auto str : vec)
        {
            count[str]++;
        }
    }


    for (auto& vec : vectors)
    {
        auto it = std::remove_if(vec.begin(), vec.end(),
                                 [&count](const std::string& str) { return count[str] > 1; });
        vec.erase(it, vec.end());
    }
}

int main()
{
    std::vector<std::vector<std::string>> myvectors = { {"a", "b"}, { "b", "c" }, { "b", "c" } };
    RemoveDuplicates(myvectors);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...