你能安全地使用std :: set作为std :: map的关键吗?

时间:2017-01-23 00:24:36

标签: c++ c++11

我定义了以下内容:

typedef std::set<std::string> entry;
typedef std::map<entry, size_t> freq_map;

通过这种方式,我可以从这个表格的文本文件中读取行,并跟踪每个集合的频率:

A;B;C
C;B;A
A;B

在我的第一个场景中,我要创建一个只有基数的频率图一套

void Apriori::populate_length_one_freq() {
    freq_map length_one_map;
    for (const auto& s : some_data_structure) {
        entry tmp = { s };
        add_to_map(tmp, length_one_map, 1);
    }
    prune_map(length_one_map, 700);
    freq.push_back(length_one_map);
}

void Apriori::add_to_map(entry& en, freq_map& map, size_t ct) {
    auto search = map.find(en);
    if (search != map.end()) {
        map.at(en) += ct;
    } else {
        map.emplace(en, ct);
    }   
}

void Apriori::prune_map(freq_map& m, const size_t cut) {
    for (auto& item : m) {
        if (item.second < cut) {
            m.erase(item.first);
        }
    }
}

这几乎可行。然而,我遇到了一个奇怪的错误。某些项目似乎没有在prune_map函数中进行迭代。我可以通过在迭代时将每个值打印到std out来验证这一点。例如,项目{&#34; Airports&#34;}未被打印。奇怪的是,当我在函数中执行机场项的m.find()时,找到该项。见下面的代码:

void Apriori::prune_map(freq_map& m, const size_t cut) {
    std::set<std::string> f = {"Airports"};
    if (m.find(f) != m.end()) {
        std::cout << "found." << std::endl;
    }

    for (auto& item : m) {
        for (auto& s : item.first) {
            std::cout << s << std::endl;
        }
        if (item.second < cut) {
            m.erase(item.first);
        }
    }
}

什么可能导致我的迭代失败?

0 个答案:

没有答案