C ++ 11设置奇怪的行为

时间:2015-12-19 15:26:40

标签: c++ stl iterator set

这是我的代码

#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。 如果我不使用比较器,一切都很好。

1 个答案:

答案 0 :(得分:2)

使用

std::set<string, comparator> var1 = // ...
std::set<string, comparator> var2 = // ...

你应该对比较器使用std::set_difference重载(并且比较器应该与var1var2订单使用相同):

std::set_difference(var1.begin(), var1.end(),
                    var2.begin(), var2.end(),
                    inserter(res, res.end()),
                    comparator{});