2 votes

set_union() ne fonctionne pas pour un ensemble de chaînes de caractères

J'ai essayé de trouver l'union de deux ensembles contenant des chaînes de caractères, en utilisant set_union(...) fonction. Mais il y a une erreur à l'intérieur de la fonction stl_algo.h ligne ar 4948 -

Erreur : passing 'const std::__cxx11::basic_string<char>' as 'this' argument discards qualifiers [-fpermissive]

Mon code :

#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;
}

3voto

Kiran Thilak Points 443

Essayez d'utiliser std::inserter

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

Mise à jour :

a1.begin() n'est tout simplement pas un itérateur de sortie. inserter(a1,a1.begin()) renvoie un itérateur de sortie qui invoquera la fonction d'insertion de l'ensemble [...] Pourquoi avons-nous besoin d'un appel à la fonction d'insertion lors de l'exécution d'un set_union pour un ensemble ?

Par ailleurs, étant donné qu'il s'agit de std::set un conteneur où l'unicité est garantie, nous n'avons pas besoin de prendre un set_union parce qu'une simple insertion d'un ensemble garantira également qu'aucune copie d'un même élément ne sera créée.

//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());

0voto

Cos Glynos Points 51

Comme indiqué dans une autre réponse, std::inserter ferait l'affaire. Vous pouvez également stocker la sortie de la fonction set_union dans un vector et, si nécessaire, construire un autre set en utilisant les valeurs de la sortie vector .

Toutefois, il convient de noter que cette approche exige que vous connaissiez la taille du vecteur soit au moment de l'exécution (fixée par l'utilisateur), soit au moment de la compilation. Dans ce dernier cas, vous pouvez utiliser un std::array . Si la sortie n'est pas connue (c'est-à-dire calculée), le vecteur de sortie risque d'être suffisamment grand pour stocker les résultats et votre programme se plantera (fuite de mémoire).

#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());
}

Exemple en ligne : https://rextester.com/MUPHB45816

Il existe également un exemple de code aquí qui utilise des vecteurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X