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){…}