这是我的代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
using namespace std;
struct comparator{
bool operator()(const string& a, const string& b) const
{
if(a.length()>b.length()){
return false;
}
else if(a.length()==b.length()){
return (a<b);
}
else{
return true;
}
}
};
void gen_combinations(string& tmp, set<string>& combs)
{
for (int i=0; i<=tmp.length(); i++)
{
for(int k=i; k<=tmp.length(); k++)
{
combs.insert(tmp.substr(i, k-i+1));
}
}
}
int main()
{
vector<string> words;
set<string> combinations;
set<string> forWord;
set<string, comparator> result;
string temp;
vector<set<string>> container;
int n;
cin >> n;
if(n!=1){
for(int i = 0; i < n; i++){
cin >> temp;
words.push_back(temp);
gen_combinations(temp, forWord);
container.push_back(forWord);
forWord.clear();
}
auto difference = [](set<string>& a, set<string>& b, set<string, comparator>& res){
set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(res, res.end()));
};
for (int i=0; i<n; i++)
{
for(int g=0;g<n;g++){
if(g!=i){
combinations.insert(container[g].begin(), container[g].end());
}
}
difference(container[i], combinations, result);
if(result.begin()==result.end()){
cout << "?";
}
else
{
cout << *result.begin();
}
cout << endl;
result.clear();
forWord.clear();
combinations.clear();
}
}
else
{
cin >> temp;
for(int i=0;i<temp.length();i++){
result.insert(temp.substr(i,1));
}
cout << *result.begin();
}
return 0;
}
我正在使用它来定义set<string, comparator> var1;
和更多集合。在填充之后,我正在尝试使用set_difference()
,这里有一些输出
变量1
a b e r ar be ea bea ear bear
变量
a b d e r ar be ea rd ard bea ear bear eard beard
变量1-变量2
bea ear bear
其中var1和var2是集合,var1-var2是set_difference() 那么为什么那段代码行为如此奇怪呢?(集合之间的区别应该是空集)
P.S。 如果我不使用比较器,一切都很好。
答案 0 :(得分:2)
使用
std::set<string, comparator> var1 = // ...
std::set<string, comparator> var2 = // ...
你应该对比较器使用std::set_difference
重载(并且比较器应该与var1
,var2
订单使用相同):
std::set_difference(var1.begin(), var1.end(),
var2.begin(), var2.end(),
inserter(res, res.end()),
comparator{});