Создать вектор set_difference из двух карт - PullRequest
1 голос
/ 05 июня 2019

В настоящее время я получаю заданную разницу двух карт, а затем перебираю полученную карту.

В идеале я хочу создать вектор разницы вместо карты.Таким образом, итерация будет более эффективной.

typedef std::map<int, Info> RegistrationMap;

RegistrationMap redundantRegs;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
std::inserter(redundantRegs, redundantRegs.begin()),
    [](const std::pair<int, Info> &p1, const std::pair<int, Info> &p2 {return p1.first < p2.first;});

for (auto reg : redundantRegs)
{
    map2[hiu.first].Status = "delete";
}

Как бы вы создали вместо этого вектор разности множеств?Можно ли это сделать с помощью функции set_difference?

Я ищу наиболее эффективный способ получения разницы.

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

std::set_difference может записать свои выходные данные в любой выходной итератор, поэтому нет проблем с записью выходных данных в вектор:

std::vector<std::pair<int, Info>> redundantRegs;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(),
                    std::back_inserter(redundantRegs),
                    ...);

(Примечание. В компараторе измените std::pair<int, Info> на std::pair<const int, Info>, чтобы избежать ненужных копий.)

1 голос
/ 05 июня 2019

Вы можете использовать std::set_difference, но вместо std::inserter лучше использовать std::back_inserter, поскольку это наиболее эффективно для std::vector, и создать std::vector соответственно:

std::vector<RegistrationMap::value_type> redundantRegs;;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
                    std::back_inserter(redundantRegs) );

Примечание: в том виде, в котором вы его написали, вам не нужно явно писать компаратор, по умолчанию он будет работать просто отлично. Если вы не используете значение по умолчанию, лучше получить его из std::map, используя std::map::value_comp(), вместо того, чтобы писать его явно, поскольку критерии сортировки должны совпадать для карты и std::set_difference:

std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
                    std::back_inserter(redundantRegs),
                    map1.value_comp() );

Живой пример

...