std::sort()ঘোষিত অ্যারে বাছাই
করতে কীভাবে স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরি ব্যবহার করবেন int v[2000];
সি ++ এমন কোনও ফাংশন সরবরাহ করে যা কোনও অ্যারের সূচনা এবং শেষ সূচক পেতে পারে?
std::sort()ঘোষিত অ্যারে বাছাই
করতে কীভাবে স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরি ব্যবহার করবেন int v[2000];
সি ++ এমন কোনও ফাংশন সরবরাহ করে যা কোনও অ্যারের সূচনা এবং শেষ সূচক পেতে পারে?
উত্তর:
সি ++ 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()বর্তমান সি ++ স্ট্যান্ডার্ডের একটি অংশ নয়, তবে আপনি boost::begin()এবং ব্যবহার করতে পারেন boost::end()।
beginএবং endকার্যকারিতা ছিল। সি ++ 11 এর আগে অবশ্য তাদের সিরিসের অসুবিধা ছিল: তারা অবিচ্ছেদ্য ধ্রুবক প্রকাশের ফলস্বরূপ ঘটেনি। সুতরাং নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে আমরা সেগুলি ব্যবহার করব বা একটি ম্যাক্রো যা দুটির বিভাজন করেছিল sizeof।
decltypeঅবশ্যই কিছু ব্যবহার সহজতর করে, তবে ফ্রি beginএবং endফাংশনগুলির সাথে এটির কী কী আছে তা আমি দেখতে পাচ্ছি না । (এবং আপনার সত্যিকারের দু'জনের দুটি হওয়া উচিত, একটি সি স্টাইল অ্যারেগুলির জন্য এবং অন্যটি পাত্রে স্বয়ংক্রিয় বৈষম্য সহ, যাতে আপনি এগুলি টেমপ্লেটগুলিতে ব্যবহার করতে পারেন, প্রকারটি কোনও ধারক বা সি স্টাইল অ্যারে কিনা তা জেনেও without)
#include <algorithm>
static const size_t v_size = 2000;
int v[v_size];
// Fill the array by values
std::sort(v,v+v_size);
ইন সি ++ 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]);
আপনি যদি আকারটি জানেন তবেও এটিকে কোড করা ভাল ধারণা কারণ এটি পরে অ্যারের আকার পরিবর্তন করা হলে বাগের সম্ভাবনা হ্রাস করবে reduce
sizeof x/sizeof *xকৌশলটি ব্যবহারের পরিবর্তে আপনার একটি নিরাপদ টেম্পলেট ব্যবহার করা উচিত: template <typename T, int N> int array_size( T (&)[N] ) { return N; }যেমন অ্যারের পরিবর্তে আপনি কোনও পয়েন্টারটি পাস করেন তবে তা ব্যর্থ হবে। প্রয়োজনে এটি একটি সংকলন ধ্রুবক হিসাবে রূপান্তর করা যেতে পারে, তবে একটি মন্তব্যে পড়তে এটি কিছুটা শক্ত হয়ে যায়।
begin()এবং end()সেগুলি ফাংশন করা instead জিওর উত্তর আমাকে ভাবায় যে এগুলি ইতিমধ্যে সি ++-এ যুক্ত করা হয়েছে, এখন মনে হয় তারা তা করেনি ... আমি লোকেরা কী বলতে চাইবে এবং তারপরে আপডেট হবে see
begin, end, size, STATIC_SIZE(ম্যাক্রো যে আয় আকার সঙ্গে একটি কম্পাইল সময় ধ্রুবক), কিন্তু সৎ হতে, আমি বললেই কি ছোট কোড নমুনা যে বাহিরে ব্যবহার করুন।
std::extent<decltype(v)>::valueসি ++ 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 যা হ্যান্ড-কোডেড দ্রুত সাজানোর চেয়ে 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)
//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()সি ++ 1x সংযোজন? তারা খুব সুন্দর - শুরু থেকেই এইভাবে হওয়া উচিত ছিল, এটি প্রচুর পরিমাণে অ্যালগোরিদমকে আরও জেনেরিক করে তুলত!