Як використовувати стандартну бібліотеку шаблонів std::sort()для сортування масиву, оголошеного як
int v[2000];
Чи надає С ++ якусь функцію, яка може отримати індекс початку та кінця масиву?
Як використовувати стандартну бібліотеку шаблонів 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 ++, але ви можете використовувати boost::begin()і boost::end().
beginта endфункції в наших особистих наборах інструментів. Однак до С ++ 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;
}
}
Це так просто ... C ++ надає вам функцію в STL (стандартна бібліотека шаблонів), sortяка працює на 20-50% швидше, ніж ручне кодування.
Ось зразок коду для його використання:
std::sort(arr, arr + size);
Сортування С ++ за допомогою функції сортування
#include <bits/stdc++.h>
using namespace std;
vector <int> v[100];
int main()
{
sort(v.begin(), v.end());
}
std::sort(arr, arr + arr_size)
Використовуйте функцію C ++ std::sort:
#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;
}
метод сортування без 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методи. Ви, мабуть, думаєте про a vector.
std::begin()таstd::end()C ++ 1x? Вони дуже симпатичні - це мало бути з самого початку, це зробило б багато алгоритмів загальнішими!