標準テンプレートライブラリを使用std::sort()
してint v[2000]
、として宣言された配列をソートする
方法。
C ++は、配列の開始インデックスと終了インデックスを取得できる関数を提供していますか?
回答:
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
機能を私たちの個人用ツールキットに持っていました。ただし、C ++ 11より前のバージョンには、重大な欠点がありました。整数定数式にはなりませんでした。したがって、特定のニーズに応じて、それらを使用するか、2つを分割したマクロを使用しますsizeof
。
decltype
確かに特定の用途を単純化しますが、それがfree begin
とend
functions とどう関係しているかはわかりません。(そして、実際には、それぞれがCスタイル配列用とコンテナー用に2つずつあり、自動判別により、タイプがコンテナーであるか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で受信できます
//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
and end
メソッドはありません。あなたは考えている必要がありますvector
。
std::begin()
とstd::end()
C ++ 1xの追加は?彼らはとても素晴らしいです-最初からこの方法でいれば、多くのアルゴリズムがより一般的になったでしょう!