Cách sử dụng thư viện mẫu chuẩn std::sort()
để sắp xếp một mảng được khai báo là
int v[2000]
;
C ++ có cung cấp một số hàm có thể lấy chỉ số bắt đầu và kết thúc của một mảng không?
Cách sử dụng thư viện mẫu chuẩn std::sort()
để sắp xếp một mảng được khai báo là
int v[2000]
;
C ++ có cung cấp một số hàm có thể lấy chỉ số bắt đầu và kết thúc của một mảng không?
Câu trả lời:
Trong C ++ 0x / 11, chúng tôi nhận được std::begin
và std::end
được nạp chồng cho các mảng:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Nếu bạn không có quyền truy cập vào C ++ 0x, không khó để tự viết chúng:
// 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()
và std::end()
không phải là một phần của Tiêu chuẩn C ++ hiện tại, nhưng bạn có thể sử dụng boost::begin()
và boost::end()
.
begin
và end
chức năng như vậy trong bộ công cụ cá nhân của mình. Tuy nhiên, trước C ++ 11, chúng có một nhược điểm: chúng không dẫn đến một biểu thức hằng tích phân. Vì vậy, tùy thuộc vào nhu cầu cụ thể, chúng tôi sẽ sử dụng chúng hoặc macro đã phân chia hai yếu tố đó sizeof
.
decltype
chắc chắn đơn giản hóa một số mục đích sử dụng, nhưng tôi không thấy nó liên quan gì đến các chức năng begin
và miễn phí end
. (Và bạn thực sự nên có hai trong số chúng, một cho mảng kiểu C và một cho vùng chứa, với khả năng phân biệt tự động, vì vậy bạn có thể sử dụng chúng trong các mẫu mà không cần biết kiểu đó là vùng chứa hay mảng kiểu 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);
Trong C ++ 11 :
#include <algorithm>
#include <array>
std::array<int, 2000> v;
// Fill the array by values
std::sort(v.begin(),v.end());
std::vector
. Mã của tôi sẽ là:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Nếu bạn không biết kích thước, bạn có thể sử dụng:
std::sort(v, v + sizeof v / sizeof v[0]);
Ngay cả khi bạn biết kích thước, bạn nên viết mã theo cách này vì nó sẽ giảm khả năng xảy ra lỗi nếu kích thước mảng được thay đổi sau này.
sizeof x/sizeof *x
thủ thuật, bạn nên sử dụng một mẫu an toàn hơn:, template <typename T, int N> int array_size( T (&)[N] ) { return N; }
vì điều đó sẽ không thành công nếu thay vì một mảng bạn chuyển một con trỏ. Nó có thể được chuyển đổi thành một hằng số thời gian biên dịch nếu cần, nhưng nó trở nên hơi khó đọc trong một nhận xét.
begin()
và end()
chức năng các mẫu chuyên biệt cho tất cả các loại vùng chứa phổ biến, bao gồm cả mảng và sử dụng chúng thay thế. Câu trả lời của Xeo khiến tôi nghĩ rằng những thứ này đã được thêm vào C ++, bây giờ có vẻ như chúng chưa ... Tôi sẽ xem những người khác phải nói gì và sau đó cập nhật.
begin
, end
, size
, STATIC_SIZE
(macro lợi nhuận một biên dịch hằng số thời gian với kích thước), nhưng thành thật mà nói, tôi hầu như không bao giờ sử dụng bên ngoài của mẫu mã nhỏ.
std::extent<decltype(v)>::value
trong C ++ 11
Bạn có thể sắp xếp nó 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;
}
}
Nó đơn giản như vậy ... C ++ cung cấp cho bạn một hàm trong STL (Thư viện mẫu chuẩn) được gọi là hàm sort
này chạy nhanh hơn 20% đến 50% so với sắp xếp nhanh được mã hóa thủ công.
Đây là mã mẫu để sử dụng nó:
std::sort(arr, arr + size);
Sắp xếp C ++ bằng cách sử dụng chức năng sắp xếp
#include <bits/stdc++.h>
using namespace std;
vector <int> v[100];
int main()
{
sort(v.begin(), v.end());
}
std::sort(arr, arr + arr_size)
Sử dụng hàm 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;
}
phương pháp sắp xếp mà không có 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;
}
}
}
Chạy ví dụ hoàn chỉnh:
#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;
}
bạn có thể dùng,
std::sort(v.begin(),v.end());
begin
và end
phương thức. Chắc hẳn bạn đang nghĩ về a vector
.
std::begin()
vàstd::end()
C ++ bổ sung 1x không? Chúng rất đẹp - lẽ ra phải theo cách này ngay từ đầu, nó sẽ khiến nhiều thuật toán trở nên chung chung hơn!