C++ 字符串的排序数组/向量
如何通过重复元素对数组/向量进行排序? 比如说 输入 输出C++ 字符串的排序数组/向量,c++,string,sorting,C++,String,Sorting,如何通过重复元素对数组/向量进行排序? 比如说 输入 输出 Leo Leo Leo Eric Leo Mike Eric Mike 我想用文字解释这个问题,你写了代码,但是我发现我对C++非常熟悉,所以我只写代码就容易多了。史蒂夫所说的略有不同。字符串的原始向量是v std::map<std::string, int> m; for(auto i=v.begin(); i!=v.end(); ++i) m[*i]++; typedef
Leo Leo
Leo Eric
Leo Mike
Eric
Mike
我想用文字解释这个问题,你写了代码,但是我发现我对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);
}
std::map m;
对于(自动i=v.begin();i!=v.end();++i)
m[*i]++;
typedef std::对P;
自动按秒计算=[](常量P&lhs,常量P&rhs){返回lhs.second秒-->0)
*i++=j->first;
m、 擦除(j);
}
我想用文字解释这个问题,你写了代码,但我发现我对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);
}
std::map m;
对于(自动i=v.begin();i!=v.end();++i)
m[*i]++;
typedef std::对P;
自动按秒计算=[](常量P&lhs,常量P&rhs){返回lhs.second秒-->0)
*i++=j->first;
m、 擦除(j);
}
我建议分三次处理您的数据:
使用std::sort获取彼此相邻的所有重复元素
在排序范围内迭代,记录每个相等范围的长度和位置
现在,您可以根据在步骤2中恢复的数据执行序列。你可以考虑在这个阶段使用Stable搜索,如果你喜欢二次搜索键是按字母顺序排列的。
我建议分三次处理您的数据:
使用std::sort获取彼此相邻的所有重复元素
在排序范围内迭代,记录每个相等范围的长度和位置
现在,您可以根据在步骤2中恢复的数据执行序列。你可以考虑在这个阶段使用Stable搜索,如果你喜欢二次搜索键是按字母顺序排列的。
没有内置的方法可以做到这一点。一种相对简单的方法是构建一个包含每个元素计数的map
(只需迭代输入向量,增加所看到的每个字符串的计数)。然后将映射中的所有键写入一个向量,并使用比较器将该向量与映射中的数字进行比较
这涉及到比严格必要的更多的映射查找,因此您可以从映射中编写一个对向量,然后对对这些对进行排序,最后从排序后的对中创建字符串向量。没有内置的方法来实现这一点。一种相对简单的方法是构建一个包含每个元素计数的map
(只需迭代输入向量,增加所看到的每个字符串的计数)。然后将映射中的所有键写入一个向量,并使用比较器将该向量与映射中的数字进行比较
这涉及到比严格必要的更多的映射查找,因此您可以从映射中编写一个对向量,然后对这些对进行排序,最后从排序后的对中创建字符串向量。您使用哪种语言?请尝试std::sort(data.begin(),data.end())
@user-然后编写你自己的排序函数。@Ramhound:为什么要重新发明这个轮子?@James:我想他的意思是让最常见的元素首先出现在列表中,等等。你使用哪种语言?试试std::sort(data.begin(),data.end())
@user-然后编写你自己的排序函数。@Ramhound:为什么要重新发明这个轮子?@James:我想他的意思是让最常见的元素首先出现在列表中,等等。Pedantry模式开启:你的P
typedef是错误的;map
的值类型为pair
。一种技术修复方法是将其更改为typedef std::pair P代码>,但首选的路径是使用map
的value\u type
:typedef std::map::value\u type P代码>,或者更好的是它的const_引用:typedef std::map::const_引用P;自动按秒计算=[](P lhs,P rhs){…}代码>踏板模式打开:您的P
typedef错误;map
的值类型为pair
。一种技术修复方法是将其更改为typedef std::pair P代码>,但首选的路径是使用map
的value\u type
:typedef std::map::value\u type P代码>,或者更好的是它的const_引用:typedef std::map::const_引用P;自动按秒计算=[](P lhs,P rhs){…}代码>