gpt4 book ai didi

c++ - 如何总结字符串中出现的字符的值,使它们成对并按升序排序?

转载 作者:行者123 更新时间:2023-12-04 08:30:34 25 4
gpt4 key购买 nike

我的任务是编写一个函数,该函数获取字符串 vector 作为参数,并返回 pair<char,int> 的 vector 。包含代表字符及其频率(字母出现的次数)的对,这些对是从作为函数参数的 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]++;
那么你可以复制这个 mapvector如所须:
vector<pair<char, int>> res;
std::ranges::copy(m, std::back_inserter(res));
最后,您可以按频率计数的升序对 vector 进行排序:
std::ranges::sort(res, std::less{}, &std::pair<char, int>::second);
这是一个 demo .

在 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 中:
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 .

关于c++ - 如何总结字符串中出现的字符的值,使它们成对并按升序排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65045789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com