set_union() 不适用于一组字符串
set_union() is not working for a set of strings
我试图使用 set_union(...)
函数找出包含字符串的两个集合的并集。但是,它在 stl_algo.h
ar 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;
}
尝试使用 std::inserter
set_union( set1.begin(), set1.end(), set2.begin(), set2.end(),std::inserter( set3, set3.begin() ));
更新:
a1.begin() is simply not an output iterator. inserter(a1,a1.begin())
returns an output iterator which will invoke the set's insert function
for each element...
Why do we need an inserter function call when doing a set_union for a set?
此外,由于我们正在处理 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());
如另一个答案中所述,std::inserter
可以胜任。或者,您可以将 set_union
的输出存储在 vector
中,如有必要,使用输出 vector
.
的值构造另一个 set
但是,应该注意的是,这种方法要求您在 运行 时(由用户设置)或在编译时知道向量的大小。在后一种情况下,您可以使用 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
还有一个使用向量的代码示例here。
我试图使用 set_union(...)
函数找出包含字符串的两个集合的并集。但是,它在 stl_algo.h
ar 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;
}
尝试使用 std::inserter
set_union( set1.begin(), set1.end(), set2.begin(), set2.end(),std::inserter( set3, set3.begin() ));
更新:
a1.begin() is simply not an output iterator. inserter(a1,a1.begin()) returns an output iterator which will invoke the set's insert function for each element... Why do we need an inserter function call when doing a set_union for a set?
此外,由于我们正在处理 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());
如另一个答案中所述,std::inserter
可以胜任。或者,您可以将 set_union
的输出存储在 vector
中,如有必要,使用输出 vector
.
set
但是,应该注意的是,这种方法要求您在 运行 时(由用户设置)或在编译时知道向量的大小。在后一种情况下,您可以使用 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
还有一个使用向量的代码示例here。