C++ 11 设置奇怪的行为
C++ 11 set strange behaviour
这是我的代码
#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
变量2
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。
如果我不使用比较器,一切正常。
有
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{});
这是我的代码
#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
变量2
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。 如果我不使用比较器,一切正常。
有
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{});