Se eu tiver um vetor de pares:
std::vector<std::pair<int, int> > vec;
Existe uma maneira fácil de classificar a lista em ordem crescente com base no segundo elemento do par?
Eu sei que posso escrever um pequeno objeto de função que fará o trabalho, mas existe uma maneira de usar partes existentes do STL e std::less
fazer o trabalho diretamente?
Edição: Eu entendo que eu posso escrever uma função ou classe separada para passar para o terceiro argumento para classificar. A questão é se posso ou não criar coisas comuns. Eu realmente algo que se parece com:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Respostas:
EDIT : usando c ++ 14, a melhor solução é muito fácil de escrever, graças às lambdas que agora podem ter parâmetros do tipo
auto
. Esta é a minha solução favorita atualBasta usar um comparador personalizado (é um terceiro argumento opcional
std::sort
)Se você estiver usando um compilador C ++ 11, poderá escrever o mesmo usando lambdas:
EDIT : em resposta às suas edições à sua pergunta, eis algumas reflexões ... se você realmente quer ser criativo e poder reutilizar muito esse conceito, basta criar um modelo:
então você pode fazer isso também:
ou mesmo
Embora, para ser honesto, isso seja um pouco exagerado, basta escrever a função de 3 linhas e concluir com ela :-P
fonte
operator<
nopair<T1,T2>
. O comparador padrão usa o primeiro e o segundo elemento (caso os primeiros sejam iguais). Aqui apenas o segundo está sendo usado."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Você pode usar o impulso assim:
Não conheço uma maneira padrão de fazer isso de forma igualmente curta e concisa, mas você pode
boost::bind
entender que é tudo composto por cabeçalhos.fonte
É muito simples você usar a função de classificação do algoritmo e adicionar sua própria função de comparação
Agora você deve fazer a comparação com base na segunda seleção, para declarar "myComparison" como
fonte
Com o C ++ 0x, podemos usar funções lambda:
Neste exemplo, o tipo de retorno
bool
é deduzido implicitamente.Tipos de retorno Lambda
Quando uma função lambda possui uma única instrução, e esta é uma instrução de retorno, o compilador pode deduzir o tipo de retorno. No C ++ 11, §5.1.2 / 4:
Para especificar explicitamente o tipo de retorno, use o formulário
[]() -> Type { }
, como em:fonte
if (lhs.second == 0)
?lhs.second < rhs.second
pode retornartrue
oufalse
e o compilador pode deduzir claramentebool
. Só queria demonstrar o[]() -> Type { }
caso.Para algo reutilizável:
Você pode usá-lo como
ou
fonte
Você precisaria confiar em um select2nd não padrão
fonte
Tente trocar os elementos dos pares para que você possa usá-lo
std::sort()
normalmente.fonte