Oczyszczanie tablicy z powtarzających się elementów

0

Witam, można jakoś uprościć kod na oczyszczanie tablicy z powtarzających się elementów, który jest poniżej ? Zrobiłem to na metodzie sprawdzania czy dany element się powtarza, jeżeli tak to przypisuje to niego napis "NULL" a potem do nowej tablicy przypisuje wszystkie elementu oprócz "NULL".

 QString job[340];
 int job_sum = 0;

...

for(int j = 0; j < job_sum; j++)
    {
        for(int k = 0; k < job_sum; k++)
        {
            if(j != k)
            {
                if(job[j] == job[k])
                {
                    job[k] = "NULL";
                }
            }
        }
    }

    QString job_new[340];
    int b = 0;

    for(int a = 0; a < job_sum; a++)
    {
        if(job[a] != "NULL")
        {
            job_new[b] = job[a];
            b++;
        }
    }
2

skorzystaj z std::set

1

Może najpierw posortuj, wtedy powtarzające się elementy będą obok siebie.

1

Nie lepiej użyć jakiegoś kontenera o zmiennej wielkości zamiast tablicy, np. std::vector?

Jeśli powtórki są koło siebie, to możesz użyć http://en.cppreference.com/w/cpp/algorithm/unique

QString job[340];
vector<QString> uniq;
copy(begin(job), unique(begin(job), end(job)), back_inserter(uniq));

http://melpon.org/wandbox/permlink/bvImbxi3ubHSdPhS

Jeśli nie, a kolejność nie ma dla Ciebie znaczenia, możesz użyć std::unordered_set, ale nie masz wpływu na kolejność.

QString job[5] = {"aaa", "bbb", "ddd", "ccc", "ddd"};
unordered_set<QString> uniq;
copy(begin(job), end(job), inserter(uniq,begin(uniq)));

http://melpon.org/wandbox/permlink/xSZ4KXnCytTvqMuz

0

A na jakiej zasadzie działa to std::set lub QSet ?? Rozchodzi mi się jak usuwa duplikaty.

1

set nie usuwa duplikatów, on je zwyczajnie nie wstawia.

0

Jeśli nie interesuje Cię kolejność, preferuj unordered_set nad set. unordered_set i QSet to hashtable, które przy dodawaniu elementu juƶ istniejącego po prostu go nie dodają.

1 użytkowników online, w tym zalogowanych: 0, gości: 1