我定义了以下内容:
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);
}
}
}
什么可能导致我的迭代失败?