set_union () не работает для набора строк - PullRequest
2 голосов
/ 25 сентября 2019

Я пытался выяснить объединение двух множеств, содержащих строки, используя функцию set_union(...).Но возникает ошибка внутри строки stl_algo.h ar № 4948 -

Ошибка: passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]

Мой код:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int t,k, tmp, i=1,j,l,m,n,x1,x2;
    cin>>n;
    string st,stt;
    set <string> set1,set2,set3;
    set1.insert("sdsd");
    set1.insert("sdswewd");
    set1.insert("ssd");

    set2.insert("sdsd");
    set2.insert("sdfewew");
    set2.insert("ssd");
    set_union(set1.begin(),set1.end(),set2.begin(),set2.end(),set3.begin());

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

попробуйте использовать std :: insertter

set_union( set1.begin(), set1.end(), set2.begin(), set2.end(),std::inserter( set3, set3.begin() ));

Обновление:

a1.begin () просто не является выходным итератором.insertter (a1, a1.begin ()) возвращает выходной итератор, который будет вызывать функцию вставки набора для каждого элемента ... Зачем нам нужен вызов функции вставки при выполнении set_union для набора?

Также, поскольку мы имеем дело с std::set контейнером, в котором гарантируется уникальность, нам не нужно брать set_union, потому что простая вставка набора также гарантирует, чтокопии одного и того же элемента не создаются.

//insert all element of set 1 to set 3
set3.insert(set1.begin(),set1.end());
//insert all elements of set 2 (that is not in set 1) to set 3
set3.insert(set2.begin(),set2.end());
0 голосов
/ 25 сентября 2019

Как уже упоминалось в другом ответе, std::inserter сделает эту работу.В качестве альтернативы вы можете сохранить выходные данные из set_union в vector и, если необходимо, создать еще один set, используя значения из выходных данных vector.

Однако следует отметить, что этоПодход требует, чтобы вы знали размер вектора во время выполнения (установленного пользователем) или во время компиляции.В последнем случае вы можете использовать std::array.Если выходные данные неизвестны (то есть рассчитаны), то выходной вектор может быть достаточно большим, чтобы сохранить результаты, и ваша программа потерпит крах (утечка памяти).

#include<iostream>
#include<set>
#include<string>
#include<algorithm>
#include<vector>

int main()
{
    std::set<std::string> set1,set2;
    set1.insert("sdsd");
    set1.insert("sdswewd");
    set1.insert("ssd");

    set2.insert("sdsd");
    set2.insert("sdfewew");
    set2.insert("ssd");

    std::vector<std::string> output(4);
    std::set_union(set1.begin(),set1.end(),set2.begin(),set2.end(),output.begin());

    std::set<std::string> set3(output.begin(),output.end());
}

Онлайн пример: https://rextester.com/MUPHB45816

Существует также пример кода здесь , который использует векторы.

...