Подсчет и получение повторений с использованием алгоритма и лямбды - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть вектор таких структур:

struct Item {
   int id;
   string name;   
}

vector<Item> v= ....;

Теперь мне нужно посмотреть, сколько уникальных «id» находится в векторе, и создать еще один вектор, содержащий эти уникальные идентификаторы (конечно, 1 изкаждый идентификатор).

Для уникальных идентификаторов я использую этот код ... но как сгенерировать вектор уникальных идентификаторов?

std::sort(v.begin(), v.end());
int uniqueCount = std::unique(v.begin(), v.end()) - v.begin();

Конечно, я могу пойти в школу и сделатьЗацикливать и помещать идентификаторы в вектор вручную, проверяя, находится ли идентификатор уже внутри вектора или нет ... но я ищу чистый подход STL, если это возможно!

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Один из возможных подходов с использованием STL и лямбды следующий, где unique_ids - это вектор уникальных идентификаторов.

DEMO

std::sort(
    v.begin(), v.end(), 
    [](const Item& l, const Item& r){ return (l.id < r.id);});

v.erase(
    std::unique(v.begin(), v.end(), 
        [](const Item& l, const Item& r) { return l.id == r.id; }),
    v.end());

std::vector<int> unique_ids;

std::transform(
    v.begin(), v.end(), std::back_inserter(unique_ids),        
    [](const Item& item){ return item.id; });
0 голосов
/ 03 декабря 2018

Из исходного вектора, не отсортированного, создайте набор, убедитесь, что оба имеют одинаковую длину, а затем создайте из него новый вектор:

vector<Item> v;
set<Item> s(begin(s), end(s));
// check s.size() == v.size()  for uniques

vector<Item> result(begin(s), end(s));
...