2

我试图找出两个包含字符串的集合的并集,使用set_union(...)函数。但是,它在stl_algo.har line no 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;
}

4

2 回答 2

3

尝试使用std::inserter

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

更新:

a1.begin() 根本不是输出迭代器。inserter(a1,a1.begin()) 返回一个输出迭代器,它将为每个元素调用集合的插入函数... 为什么在为集合执行 set_union 时需要一个插入函数调用?

此外,由于我们正在处理std::set一个保证唯一性的容器,我们不需要采用 a 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());
于 2019-09-25T08:35:37.147 回答
0

正如另一个答案中提到的那样,std::inserter会完成这项工作。或者,您可以将输出存储set_union在 a 中vector,如有必要,set使用 output 中的值构造另一个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

这里还有一个使用向量的代码示例。

于 2019-09-25T08:40:07.470 回答