Отсортировать вектор определенным образом
Надо отсортировать вектор ans (тип char) в алфавитном порядке, при этом сначала должны идти буквы нижнего регистра, затем - верхнего. Честно пыталась найти решение в гугле, но почти все-с указателями. Можно без них решение, пожалуйста
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// читайте сразу конец кода
int main() {
int n, m;
cin >> n >> m;
vector <vector <char>> pole(n, vector <char>(m)), pole2(n, vector <char>(m));
string x, nada;
vector <char> ans;
for (int i = 0; i < n; i++) {
cin >> x;
for (int j = 0; j < m; j++) {
pole[i][j] = x[j];
}
x.clear();
}
for (int i = 0; i < n; i++) {
cin >> x;
for (int j = 0; j < m; j++) {
pole2[i][j] = x[j];
}
x.clear();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (pole[i][j] != pole2[i][j]) { ans.push_back(pole[i][j]); }
}
}
for (int i = 0; i < ans.size(); i++) {
if (ans[i] == '.') { ans.erase(ans.begin() + i); i = 0; }
}
cout << ans.size() << endl;
sort(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++) {
cout << ans[i];
}
}
Ответы (1 шт):
Автор решения: AR Hovsepyan
→ Ссылка
А без вашего кода?...
//функция сравнения
bool cmp(const char a, const char b)
{
if (islower(a) && std::isupper(b))
return true;
else if (islower(b) && std::isupper(a))
return false;
return a < b;
}
//макрос для удобства
#define ALL(v) v.begin(),v.end()
//вводим, сортируем,удаляем повторяющийся символы и выводим
int main()
{
using Iter = std::istream_iterator<char>;
std::vector<char>ans{ Iter(std::cin), Iter()};
std::sort(ALL(ans), cmp);
ans.erase( std::unique(ALL(ans)));
std::copy(ALL(ans), std::ostream_iterator<char>(std::cout, " "));
//Ну и можно освобождать лишнюю память(уменьшить
//занимаемый объем до нужного), если вектор еще где то нужен
ans.shrink_to_fit();
//...
return 0;
}