如何求和字符串中出现的字符的值,使它们成对并按升序排序?

How to sum up values of occuring chars from a string, make them pairs and sort them in ascending order?

我的任务是编写一个函数,该函数获取一个字符串向量作为参数,returns 一个 pair<char,int> 向量,其中包含代表字符及其频率的对(字母出现的次数)出现)从作为函数参数传递给 vector 的所有字符串中求和。也应该按升序排序。

下面的代码是我的方法。到目前为止,我只能计算出该字符在每个字符串中出现了多少次,但我无法将所有出现的字母加起来成为一对。

#include <iostream>
#include <vector>
#include <utility>
#include <string>

using namespace std;

bool isEqual(const pair<char, int> &element) {
    return element.first;
}

vector<pair<char, int>> all_occurrences(vector<string> vec) {

    vector<pair<char, int>> sorted_vec;
    vector<pair<char, int>> final_vec;

    char c;
    int count_chars = 0;
    string element;
    vector<char> check_chars = {' '};
    bool char_found = false;

    for (int i = 0; i < vec.size(); i++) {

        element = vec[i];

        for (int j = 0; j < element.length(); j++) {

            c = element.at(j);

            for (int k = 0; k < check_chars.size(); ++k) {
                if (c == check_chars[k]) {
                    char_found = true;
                    break;
                }
            }

            if (!char_found) {
                check_chars.push_back(c);
                count_chars = count(element.begin(), element.end(), c);
                sorted_vec.push_back(make_pair(c, count_chars));
            }

            char_found = false;

        }
        check_chars = {' '};
    }

    vector<pair<char, int>>::iterator it;

    for (int i = 0; i < sorted_vec.size(); ++i) {

        it = find_if(sorted_vec.begin(), sorted_vec.end(), isEqual);
        cout << it << endl;

    }


    return sorted_vec;
}

void print_vector(vector<pair<char, int>> pair_vector) {

    cout << "---" << endl;

    for (int i = 0; i < pair_vector.size(); i++) {
        cout << pair_vector[i].first << ',' << pair_vector[i].second << endl;
    }

    cout << "---" << endl;

}


int main() {

    vector<string> string_vector = {"ala", "ma", "kota"};
    print_vector(all_occurrences(string_vector));
    return 0;
}

首先你可以用std::map:

计算所有的频率计数
std::map<char,int> m;
for(auto c : vec | std::views::join)  // for every char in all strings
    m[c]++;

然后你可以根据需要将这个map复制到一个vector中:

vector<pair<char, int>> res;
std::ranges::copy(m, std::back_inserter(res));        

最后,您可以按频率计数的升序对向量进行排序:

std::ranges::sort(res, std::less{}, &std::pair<char, int>::second);

这是 demo


Pre C++20,你可以这样写上面的代码:

构建频率计数:

std::map<char,int> m;
for (auto const &s : vec)  // for every string
    for(auto c : s)        // for every character
        m[c]++;            // add to the frequency count  

复制到向量中:

vector<pair<char, int>> res;
std::copy(m.begin(), m.end(), std::back_inserter(res));        

并排序:

std::sort(res.begin(), res.end(), [](auto a, auto b) {
    return a.second < b.second;
});

这是 demo.