如何求和字符串中出现的字符的值,使它们成对并按升序排序?
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.
我的任务是编写一个函数,该函数获取一个字符串向量作为参数,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.