对字符串的数组/向量进行排序
Sort array/vector of string
如何通过元素的重复排序数组/向量?例如
输入Leo
Mike
Eric
Leo
Leo
<<p>输出strong> _ _ _ 或Leo Leo
Leo Eric
Leo Mike
Eric
Mike
我建议分3次处理数据:
-
使用std::sort获取所有相邻的重复元素
-
遍历排序范围,记录每个equal_range的长度和位置。
-
现在您可以根据在步骤2中恢复的数据恢复序列。如果希望二级搜索键按字母顺序排列,则可以考虑在此阶段使用stable_search。
我本想用文字解释这一点,让你写代码,但我发现我现在对c++很熟悉,对我来说写代码要容易得多。和史蒂夫说的略有不同。字符串的原始向量是v
std::map<std::string, int> m;
for(auto i=v.begin(); i!=v.end(); ++i)
m[*i]++;
typedef std::pair<std::string, int> P;
auto comp_by_second = [](const P & lhs, const P & rhs) { return lhs.second < rhs.second; };
for(auto i=v.begin(); !m.empty(); )
{
auto j = std::max_element(m.begin(), m.end(), comp_by_second);
while(j->second-- > 0)
*i++ = j->first;
m.erase(j);
}
没有内置的方法可以做到这一点。一种相对简单的方法是构建包含每个元素计数的map<string, size_t>
(只需迭代输入向量,对看到的每个字符串增加计数)。然后将映射中的所有键写入一个向量,并将该向量与比较器(用于比较映射中的数字)std::sort
。
这涉及到比严格必要的更多的映射查找,因此您可以从映射中编写一个对的向量,然后对这些对排序,最后从排序后的对创建字符串向量。
相关文章:
- 计算排序向量的向量中唯一值的计数
- 查找两个排序向量中共有的元素
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何从C++的对的排序向量中获取有关给定值的相应对
- 对象接收堆栈溢出异常 c++ 的排序向量
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 指向指针排序向量的指针向量的 C++ 向量
- 未排序向量上的lower_bound/upper_bound
- 智能指针的排序向量:神秘崩溃
- 按类型排序向量并按类型或派生类型搜索
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 字符串指针的排序向量
- 具有前导数字的字符串的排序向量
- 保证重新排序向量
- 结构解释的C 排序向量
- 更新排序向量的一个条目
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 排序向量上 std::find_if 和 std::bind2nd 的替代品
- 使用QuickSort算法以降序排序向量