Как использовать стандартную библиотеку шаблонов std::sort()
для сортировки массива, объявленного как
int v[2000]
;
Предоставляет ли С ++ некоторую функцию, которая может получить начальный и конечный индекс массива?
В C ++ 0x / 11 получаем std::begin
и std::end
которые перегружены для массивов:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Если у вас нет доступа к C ++ 0x, их нетрудно написать самостоятельно:
// 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()
иstd::end()
C ++ 1x? Они очень хороши - так должно было быть с самого начала, это сделало бы многие алгоритмы более универсальными!std::begin()
иstd::end()
не являются частью текущего стандарта C ++, но вы можете использоватьboost::begin()
иboost::end()
.begin
иend
функции в наших личных наборов инструментов. Однако до C ++ 11 у них был серьезный недостаток: они не приводили к целочисленному константному выражению. Поэтому, в зависимости от конкретных потребностей, мы использовали бы их или макрос, который делил эти два элементаsizeof
.decltype
конечно, упрощает некоторые варианты использования, но я не понимаю, какое это имеет отношение к бесплатнымbegin
иend
функциям. (И у вас действительно должно быть по два каждого из них, один для массивов в стиле C, а другой для контейнеров с автоматическим распознаванием, поэтому вы можете использовать их в шаблонах, не зная, является ли тип контейнером или массивом в стиле C.)#include <algorithm> static const size_t v_size = 2000; int v[v_size]; // Fill the array by values std::sort(v,v+v_size);
В C ++ 11 :
#include <algorithm> #include <array> std::array<int, 2000> v; // Fill the array by values std::sort(v.begin(),v.end());
источник
std::vector
. Мой код будет:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Если вы не знаете размер, вы можете использовать:
std::sort(v, v + sizeof v / sizeof v[0]);
Даже если вы знаете размер, рекомендуется закодировать его таким образом, так как это снизит вероятность ошибки, если размер массива изменится позже.
источник
sizeof x/sizeof *x
трюка вам следует использовать более безопасный шаблон:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
поскольку это не удастся, если вместо массива вы передадите указатель. При необходимости его можно преобразовать в константу времени компиляции, но читать в комментариях становится слишком сложно.begin()
иend()
использовать шаблоны, которые специализируются на всех распространенных типах контейнеров, включая массивы, и использовать их вместо них. Ответ Xeo заставил меня подумать, что они уже были добавлены в C ++, теперь кажется, что нет ... Я посмотрю, что еще люди скажут, а затем обновлю.begin
,end
,size
,STATIC_SIZE
(макроса , который возвращает компиляции постоянного времени с размером), но если честно, я вряд ли когда - либо использовать , что за пределы небольших образцов коды.std::extent<decltype(v)>::value
в C ++ 11Вы можете отсортировать это
std::sort(v, v + 2000)
источник
//It is working #include<iostream> using namespace std; void main() { int a[5]; int temp=0; cout<<"Enter Values"<<endl; for(int i=0;i<5;i++) { cin>>a[i]; } for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } cout<<"Asending Series"<<endl; for(int i=0;i<5;i++) { cout<<endl; cout<<a[i]<<endl; } for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { if(a[i]<a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } cout<<"Desnding Series"<<endl; for(int i=0;i<5;i++) { cout<<endl; cout<<a[i]<<endl; } }
источник
вы можете использовать sort () в C ++ STL. Синтаксис функции sort ():
sort(array_name, array_name+size) So you use sort(v, v+2000);
источник
Это так просто ... C ++ предоставляет вам функцию в STL (стандартной библиотеке шаблонов),
sort
которая выполняется на 20-50% быстрее, чем ручная быстрая сортировка.Вот пример кода для его использования:
std::sort(arr, arr + size);
источник
Сортировка C ++ с использованием функции сортировки
#include <bits/stdc++.h> using namespace std; vector <int> v[100]; int main() { sort(v.begin(), v.end()); }
источник
std::sort(arr, arr + arr_size)
Используйте
std::sort
функцию C ++ :#include <algorithm> using namespace std; int main() { vector<int> v(2000); sort(v.begin(), v.end()); }
источник
//sort by number bool sortByStartNumber(Player &p1, Player &p2) { return p1.getStartNumber() < p2.getStartNumber(); } //sort by string bool sortByName(Player &p1, Player &p2) { string s1 = p1.getFullName(); string s2 = p2.getFullName(); return s1.compare(s2) == -1; }
источник
С библиотекой Ranges, которая входит в C ++ 20, вы можете использовать
напрямую, где
arr
находится встроенный массив.источник
метод сортировки без
std::sort
:// sorting myArray ascending int iTemp = 0; for (int i = 0; i < ARRAYSIZE; i++) { for (int j = i + 1; j <= ARRAYSIZE; j++) { // for descending sort change '<' with '>' if (myArray[j] < myArray[i]) { iTemp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = iTemp; } } }
Выполнить полный пример:
#include <iostream> // std::cout, std::endl /* http://en.cppreference.com/w/cpp/header/iostream */ #include <cstdlib> // srand(), rand() /* http://en.cppreference.com/w/cpp/header/cstdlib */ #include <ctime> // time() /* http://en.cppreference.com/w/cpp/header/ctime */ int main() { const int ARRAYSIZE = 10; int myArray[ARRAYSIZE]; // populate myArray with random numbers from 1 to 1000 srand(time(0)); for (int i = 0; i < ARRAYSIZE; i++) { myArray[i] = rand()% 1000 + 1; } // print unsorted myArray std::cout << "unsorted myArray: " << std::endl; for (int i = 0; i < ARRAYSIZE; i++) { std::cout << "[" << i << "] -> " << myArray[i] << std::endl; } std::cout << std::endl; // sorting myArray ascending int iTemp = 0; for (int i = 0; i < ARRAYSIZE; i++) { for (int j = i + 1; j <= ARRAYSIZE; j++) { // for descending sort change '<' with '>' if (myArray[j] < myArray[i]) { iTemp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = iTemp; } } } // print sorted myArray std::cout << "sorted myArray: " << std::endl; for (int i = 0; i < ARRAYSIZE; i++) { std::cout << "[" << i << "] -> " << myArray[i] << std::endl; } std::cout << std::endl; return 0; }
источник
ты можешь использовать,
std::sort(v.begin(),v.end());
источник
begin
иend
методов. Вы, должно быть, думаете оvector
.