표준 템플릿 라이브러리를 사용 std::sort()하여 다음과 같이 선언 된 배열을 정렬하는
방법 int v[2000];
C ++는 배열의 시작 및 끝 인덱스를 가져올 수있는 일부 함수를 제공합니까?
표준 템플릿 라이브러리를 사용 std::sort()하여 다음과 같이 선언 된 배열을 정렬하는
방법 int v[2000];
C ++는 배열의 시작 및 끝 인덱스를 가져올 수있는 일부 함수를 제공합니까?
답변:
C에서 + +0 / 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우리의 개인적인 도구 키트에 기능을. 그러나 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)>::valueC ++ 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 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메서드 가 없습니다 . 당신은 vector.
std::begin()및std::end()C ++ 1X 추가? 그것들은 매우 훌륭합니다. 처음부터 이런 식 이었어 야했고, 많은 알고리즘을보다 포괄적으로 만들었을 것입니다!