迭代向量以更新 word_counter
Iterate over a vector to update a word_counter
我有一个 Result 结构向量,每个结构都包含一个合约字符串,它是 "word"
struct Result
{
string contract;
int score;
};
我想找出向量中不同单词的出现频率。
我可以使用分隔符将它们全部连接成一段文本并从中提取频率
text_tokenizer tok(text, separator);
for (text_tokenizer::iterator it = tok.begin(), it_end = tok.end();
it != it_end; ++it)
{
++total_occurrences;
word_counter::iterator wit = wc.insert(*it).first;
wc.modify_key(wit, ++bl::_1);
}
使用 multi_index_container
typedef multi_index_container
<
word_counter_entry,
indexed_by
<
ordered_non_unique
<
BOOST_MULTI_INDEX_MEMBER(
word_counter_entry, unsigned int, occurrences),
std::greater<unsigned int>
>,
hashed_unique
<
BOOST_MULTI_INDEX_MEMBER(word_counter_entry, std::string, word)
>
>
> word_counter;
但是迭代原始向量似乎更干净
for (std::vector<Result>::iterator it = begin(v); it != end(v); ++it)
{
//Magically update word counter
}
非常感谢任何合适的魔法。
您可以只创建一个以单词为键,频率(计数)为值的映射。
std::map<std::string, int> frequency;
for (auto& result : v) {
frequency[result.contract]++;
}
我有一个 Result 结构向量,每个结构都包含一个合约字符串,它是 "word"
struct Result
{
string contract;
int score;
};
我想找出向量中不同单词的出现频率。
我可以使用分隔符将它们全部连接成一段文本并从中提取频率
text_tokenizer tok(text, separator);
for (text_tokenizer::iterator it = tok.begin(), it_end = tok.end();
it != it_end; ++it)
{
++total_occurrences;
word_counter::iterator wit = wc.insert(*it).first;
wc.modify_key(wit, ++bl::_1);
}
使用 multi_index_container
typedef multi_index_container
<
word_counter_entry,
indexed_by
<
ordered_non_unique
<
BOOST_MULTI_INDEX_MEMBER(
word_counter_entry, unsigned int, occurrences),
std::greater<unsigned int>
>,
hashed_unique
<
BOOST_MULTI_INDEX_MEMBER(word_counter_entry, std::string, word)
>
>
> word_counter;
但是迭代原始向量似乎更干净
for (std::vector<Result>::iterator it = begin(v); it != end(v); ++it)
{
//Magically update word counter
}
非常感谢任何合适的魔法。
您可以只创建一个以单词为键,频率(计数)为值的映射。
std::map<std::string, int> frequency;
for (auto& result : v) {
frequency[result.contract]++;
}