C++ 11 设置奇怪的行为

标签 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 

变量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() 那么为什么这段代码表现得如此奇怪?(集合之间的区别应该是空集)

附言 如果我不使用比较器,一切正常。

最佳答案

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{});

关于C++ 11 设置奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34372328/

相关文章:

python - 自定义迭代器类与生成器?

c++ - 它没有像预期的那样 sleep

c++ - 什么是单遍算法

c++ - 为什么二进制搜索函数会抛出错误?

c++ - 为什么添加新项目时 list.end() 没有改变?

python - 是否有任何单一函数来打印可迭代的值?

c++ - 您使用过任何 C++ 解释器(不是编译器)吗?

c++ - MSVS C++,如何编译扩展名为 *.i 的已预处理文件?

c# - 处理从 C++/MFC 应用程序中的 .NET dll 抛出的异常

c++ - 在这种情况下可以使用 std::array(或 boost::array),还是我坚持使用 std::vector 和 native 数组?