【发布时间】:2011-08-19 07:58:55
【问题描述】:
如何使用标准模板库std::sort() 对声明为的数组进行排序
int v[2000];
C++ 是否提供了一些函数可以获取数组的开始和结束索引?
【问题讨论】:
如何使用标准模板库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++1x 的补充吗?它们非常好——从一开始就应该是这样,它会让很多算法更通用!
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(返回编译时间常数的宏size),但老实说,除了小代码示例之外,我几乎从不使用它。
std::extent<decltype(v)>::value可以接收数组的大小
你可以排序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()。 sort() 函数语法:
sort(array_name, array_name+size)
So you use sort(v, v+2000);
【讨论】:
就这么简单...C++ 在 STL(标准模板库)中为您提供了一个名为 sort 的函数,它的运行速度比手动编码的快速排序快 20% 到 50%。
这是它的使用示例代码:
std::sort(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;
}
【讨论】:
借助 C++20 中的 Ranges 库,您可以使用
ranges::sort(arr);
直接,其中arr 是一个内置数组。
【讨论】:
不带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;
}
}
}
Run 完整示例:
#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;
}
【讨论】:
使用排序函数的C++排序
#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());
}
【讨论】:
你可以使用,
std::sort(v.begin(),v.end());
【讨论】:
begin 和 end 方法。你一定在想vector。