【问题标题】:Getting count of strings in vector c++获取向量c ++中的字符串计数
【发布时间】:2012-05-23 23:50:35
【问题描述】:

我有这个向量

vector <string> data

data = ["this is", "data that", "is in", "this is", "vector", "vector", "vector"]

如何获得一个向量(或 2D 数组)来删除重复项,而是获得每个第 i 个条目的计数?

 results = [("this is", 2), ("data that", 1), ("is in", 1), ("vector", 3)]

【问题讨论】:

  • Xeo,我尝试了很多方法。即对于 data 中的每个字符串 s,查看 data 中的其余元素,并为 s 的每个匹配项增加计数。看起来这是 O(n^2) 但我正在寻找更高效的东西
  • 您可能想尝试std::map&lt;string, int&gt;... 您可以按字符串索引,并根据需要增加计数器。 maps 按键(此处为字符串)排序,不能有重复项。获取未排序的字符串列表/向量并填充地图是 O(N x log2N) 操作。
  • 对我来说这听起来像是一个冲突(哈希)表。试着查一下。

标签: c++ string stl vector count


【解决方案1】:

直接的解决方案是将唯一值及其计数累积到地图中:

std::map<std::string, std::size_t> results;
std::for_each(begin(data), end(data), [&](std::string const& s)
{
    ++results[s];
});

这具有线性 (n lg n) 时间复杂度,但因为它必须复制每个不同的字符串值,所以它可能相当昂贵。您还可以对列表进行就地排序,然后计算每个值的数量,如果您有一个移动感知实现 std::string,这可能会表现得更好。

【讨论】:

  • 您也可以只使用std::reference_wrapper&lt;std::string&gt; 作为键。
  • 哈希表怎么样? en.wikipedia.org/wiki/Hash_table (复杂度 O(n))
  • @MihaiTodor:把std::map改成std::unordered_map
  • @MihaiTodor:unordered_map 的表现可能不会更好,在最坏的情况下,它的表现可能会差很多很多。自平衡二叉搜索树具有更可预测的性能特征,这通常是可取的。除非您确定无序容器会提高性能,否则我建议坚持使用有序容器(不过,尝试无序容器看看它们是否有帮助肯定没有错)。
  • 我认为这真的取决于数据的具体细节,而在这种情况下,我的猜测是他应该先尝试最简单的方法。他可能会很幸运,甚至可以通过这种方式选择最佳解决方案。当您是初学者时,请始终保持简单:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2022-07-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多