C++ 不确定要使用哪个数据结构

C++ 不确定要使用哪个数据结构,c++,data-structures,C++,Data Structures,假设我有以下文本: today was a good day and today was a sunny day. 我把这段文字分成几行,用空格隔开,这是 Today was a good 等等 现在,我使用矢量数据结构通过.size()简单计算文本中的字数。完成了 然而,我还想检查一个单词是否出现了不止一次,如果是,有多少次。在我的例子中,“今天”出现两次 我想存储“今天”并附加一个2/x(取决于它在大文本中出现的频率)。这不仅仅是为了“今天”,而是为了课文中的每一个单词。我想查找

假设我有以下文本:

today was a good day and today was a sunny day. 
我把这段文字分成几行,用空格隔开,这是

Today

was

a

good
等等

现在,我使用矢量数据结构通过.size()简单计算文本中的字数。完成了

然而,我还想检查一个单词是否出现了不止一次,如果是,有多少次。在我的例子中,“今天”出现两次

我想存储“今天”并附加一个2/x(取决于它在大文本中出现的频率)。这不仅仅是为了“今天”,而是为了课文中的每一个单词。我想查找一个单词出现的频率,附加一个计数器,并按降序对其排序(单词+计数器)(这是另一回事,但是 现在不重要)

我不确定在这里使用哪种数据结构。也许是地图?但我无法将计数器添加到地图


编辑:这就是我到目前为止所做的:

为什么不使用两种数据结构?您现在拥有的向量,a,使用字符串作为键,整数作为数据,这将是在文本中找到单词的次数。

您应该使用映射。事实上,你应该使用一个无序的地图

unordered_map
将为您提供一个使用字符串作为键的哈希表,您可以增加整数以保持计数

无序映射
具有O(1)查找和插入优于O(logn)查找和插入
映射
的优点。这是因为前者使用数组作为容器,而后者使用一些树的实现(我认为是红黑的)

无序映射的唯一缺点是,正如其名称中所述,您不能按词汇顺序迭代所有元素。从上面对其结构的解释中可以清楚地看出这一点。然而,您似乎不需要这样的遍历,因此它不应该是一个问题

unordered_map<string,int> mymap;
mymap[word]++; // will increment the counter associated with the count of a word.
无序映射mymap;
mymap[word]++;//将递增与字计数关联的计数器。

按字母顺序对向量排序。 扫描并将每个单词与后面的单词进行比较,直到找到不同的单词,然后继续

a, a, and, day, day, sunny, today, today, was, was
2     1    2         1      2             2

一个更好的选择是基数树, 这是相当高效的内存,在大文本输入的情况下,它的性能将优于其他数据结构


可以将单词的频率存储在树的节点中。此外,它还将获得“引用的位置[对于任何文本文档]”的好处。

如果您希望同时快速搜索元素/计数和迭代数据或保留初始顺序,则通常最好使用两个容器。在这种情况下,第二个容器可能只保留另一个容器的迭代器,这当然需要使用一个保留迭代器的容器……您能给我一个示例代码吗?我有过类似的想法。使用我的向量,在前面使用sort()进行排序,并添加到映射。我只是不确定如何…但我可以在之前进行排序(vector.begin(),vector.end()),然后将它们添加到无序的_映射中,该映射将由于排序而被排序,不是吗?啊,很好,这很有效。我的代码正常工作了。现在开始学习数学函数,如按降序排序。。。