Быстрая реализация, использующая как можно больше стандартной библиотеки:
#include <cctype>
#include <algorithm>
#include <string>
#include <iostream>
int main(){
auto compare = [](char a, char b){
char upperA = std::toupper(a);
char upperB = std::toupper(b);
if(upperA != upperB) return upperA < upperB;
if(upperA == a) return true;
return false;
};
std::string input = "ADaEedbaaaaa";
std::sort(input.begin(), input.end(), compare);
auto endOfUniques = std::unique(input.begin(), input.end());
input.erase(endOfUniques, input.end());
std::cout << input << std::endl;
}
Если вам абсолютно необходимо использовать std :: priority_queue вместо std :: sort, эта немного менее элегантная версияработает, хотя и не выполняет дедупликации (для меня неясно, является ли требование «НЕТ Дубликатов, разрешенных в строке» для ввода или вывода):
#include <cctype>
#include <string>
#include <iostream>
#include <queue>
int main(){
struct compare{
bool operator()(char a, char b){
char upperA = std::toupper(a);
char upperB = std::toupper(b);
if(upperA != upperB) return upperA > upperB;
if(upperA == a) return false;
return true;
}
};
std::string input = "ADaEedb";
std::priority_queue<char, std::vector<char>, compare> queue;
for(auto c : input) queue.push(c);
std::string output;
while(!queue.empty()){
output += queue.top();
queue.pop();
}
std::cout << output << std::endl;
}