Como usar a biblioteca de modelos padrão std::sort()
para classificar uma matriz declarada como
int v[2000]
;
C ++ fornece alguma função que pode obter o índice inicial e final de uma matriz?
Em C ++ 0x / 11, obtemos std::begin
e std::end
que estão sobrecarregados de matrizes:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Se você não tem acesso a C ++ 0x, não é difícil escrevê-los você mesmo:
// for container with nested typedefs, non-const version
template<class Cont>
typename Cont::iterator begin(Cont& c){
return c.begin();
}
template<class Cont>
typename Cont::iterator end(Cont& c){
return c.end();
}
// const version
template<class Cont>
typename Cont::const_iterator begin(Cont const& c){
return c.begin();
}
template<class Cont>
typename Cont::const_iterator end(Cont const& c){
return c.end();
}
// overloads for C style arrays
template<class T, std::size_t N>
T* begin(T (&arr)[N]){
return &arr[0];
}
template<class T, std::size_t N>
T* end(T (&arr)[N]){
return arr + N;
}
std::begin()
estd::end()
C ++ 1x adições? Eles são muito legais - deveriam ter sido assim desde o início, teria tornado muitos algoritmos mais genéricos!std::begin()
estd::end()
não fazem parte do padrão C ++ atual, mas você pode usarboost::begin()
eboost::end()
.begin
eend
em nossos kits de ferramentas pessoais. Antes do C ++ 11, entretanto, eles tinham uma grande desvantagem: eles não resultavam em uma expressão constante integral. Então, dependendo das necessidades específicas, nós usávamos, ou uma macro que fazia a divisão dos doissizeof
.decltype
certamente simplifica certos usos, mas não vejo o que isso tem a ver com o freebegin
e asend
funções. (E você realmente deve ter dois cada um deles, um para arrays de estilo C e outro para contêineres, com discriminação automática, para que possa usá-los em modelos, sem saber se o tipo é um contêiner ou um array de estilo C.)Em C ++ 11 :
fonte
std::vector
. Meu código seria:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Se você não souber o tamanho, pode usar:
Mesmo se você souber o tamanho, é uma boa ideia codificá-lo dessa forma, pois isso reduzirá a possibilidade de um bug se o tamanho do array for alterado posteriormente.
fonte
sizeof x/sizeof *x
truque, você deve usar um modelo mais seguro:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
pois isso falhará se em vez de um array você passar um ponteiro. Ele pode ser convertido em uma constante de tempo de compilação, se necessário, mas torna-se um pouco difícil de ler em um comentário.begin()
eend()
funcionar modelos especializados para todos os tipos de contêineres comuns, incluindo arrays, e usá-los em seu lugar. A resposta de Xeo me fez pensar que eles já tinham sido adicionados ao C ++, agora parece que não ... Vou ver o que mais as pessoas têm a dizer e depois atualizar.begin
,end
,size
,STATIC_SIZE
(macro que retorna uma constante de tempo de compilação com o tamanho), mas para ser honesto, eu quase nunca usar isso fora de amostras de código pequeno.std::extent<decltype(v)>::value
em C ++ 11Você pode ordenar
std::sort(v, v + 2000)
fonte
fonte
você pode usar sort () em C ++ STL. Sintaxe da função sort ():
fonte
Classificação C ++ usando a função de classificação
fonte
std::sort(arr, arr + arr_size)
Use a
std::sort
função C ++ :fonte
fonte
É tão simples quanto isso ... C ++ está fornecendo a você uma função chamada STL (Standard Template Library)
sort
que é executada de 20% a 50% mais rápido do que a classificação rápida codificada manualmente.Aqui está o código de amostra para seu uso:
fonte
Com a biblioteca Ranges que vem em C ++ 20, você pode usar
diretamente, onde
arr
está um array embutido.fonte
método de classificação sem
std::sort
:Execute um exemplo completo:
fonte
você pode usar,
fonte
begin
eend
. Você deve estar pensando em avector
.