求帮忙解释下C++中std::sort()函数中的参数问题,如何得到需要排序的n数量的问题。详情请看下面:
答案:2 悬赏:0 手机版
解决时间 2021-02-03 02:33
- 提问者网友:蓝莓格格巫
- 2021-02-02 13:59
求帮忙解释下C++中std::sort()函数中的参数问题,如何得到需要排序的n数量的问题。详情请看下面:
最佳答案
- 五星知识达人网友:由着我着迷
- 2021-02-02 14:40
last不算的, 这是STL的惯例.
STL中的所有算法, first~last这样的参数, 都是不算在内的.
int a[4] 这样的数据排序.
参数就是 first = a last = a+4 一共4个数据, 分别是a+0, a+1, a+2, a+3
last也就是a+4不算在内.
至于内部编码, std::sort的实现是函数模板.
下面是VC编译器的源代码, 在algorithm头文件中. 这个头文件就是STL的算法库.
template class _Diff,
class _Pr> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
{ // order [_First, _Last), using _Pred
_Diff _Count;
for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
{ // divide and conquer by quicksort
pair<_RanIt, _RanIt> _Mid =
_Unguarded_partition(_First, _Last, _Pred);
_Ideal /= 2, _Ideal += _Ideal / 2; // allow 1.5 log2(N) divisions
if (_Mid.first - _First < _Last - _Mid.second)
{ // loop on second half
_Sort(_First, _Mid.first, _Ideal, _Pred);
_First = _Mid.second;
}
else
{ // loop on first half
_Sort(_Mid.second, _Last, _Ideal, _Pred);
_Last = _Mid.first;
}
}
if (_ISORT_MAX < _Count)
{ // heap sort if too many divisions
_STD make_heap(_First, _Last, _Pred);
_STD sort_heap(_First, _Last, _Pred);
}
else if (1 < _Count)
_Insertion_sort(_First, _Last, _Pred); // small
}追问请问有什么理论依据吗?比如说他的内部结构中有提到啊什么的。追答这是一个 约定的惯例, STL即 C++标准模板库 里面的函数都是这么定义的.
这么定义是为了能够很好的配合标准容器来使用, 而且统一.
这样的参数都会是一个半开半闭区间[first, last), '[' 表示包括, ')'表示不包括
统一的好处就是, 你拿到一个函数, 不需要去看书, 就知道参数中的Last是不包括的.
string str = "lkijuhgtfrds";
sort(str.begin(), str.end()); // 字符串中的字符小到大排序.
// begin 和 end 迭代器所有标准容器都有. 范围就是[begin, end)追问好的,谢谢了。明天向老师解释解释。。。我就不行还会继续死掉。。。。
STL中的所有算法, first~last这样的参数, 都是不算在内的.
int a[4] 这样的数据排序.
参数就是 first = a last = a+4 一共4个数据, 分别是a+0, a+1, a+2, a+3
last也就是a+4不算在内.
至于内部编码, std::sort的实现是函数模板.
下面是VC编译器的源代码, 在algorithm头文件中. 这个头文件就是STL的算法库.
template
class _Pr> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
{ // order [_First, _Last), using _Pred
_Diff _Count;
for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
{ // divide and conquer by quicksort
pair<_RanIt, _RanIt> _Mid =
_Unguarded_partition(_First, _Last, _Pred);
_Ideal /= 2, _Ideal += _Ideal / 2; // allow 1.5 log2(N) divisions
if (_Mid.first - _First < _Last - _Mid.second)
{ // loop on second half
_Sort(_First, _Mid.first, _Ideal, _Pred);
_First = _Mid.second;
}
else
{ // loop on first half
_Sort(_Mid.second, _Last, _Ideal, _Pred);
_Last = _Mid.first;
}
}
if (_ISORT_MAX < _Count)
{ // heap sort if too many divisions
_STD make_heap(_First, _Last, _Pred);
_STD sort_heap(_First, _Last, _Pred);
}
else if (1 < _Count)
_Insertion_sort(_First, _Last, _Pred); // small
}追问请问有什么理论依据吗?比如说他的内部结构中有提到啊什么的。追答这是一个 约定的惯例, STL即 C++标准模板库 里面的函数都是这么定义的.
这么定义是为了能够很好的配合标准容器来使用, 而且统一.
这样的参数都会是一个半开半闭区间[first, last), '[' 表示包括, ')'表示不包括
统一的好处就是, 你拿到一个函数, 不需要去看书, 就知道参数中的Last是不包括的.
string str = "lkijuhgtfrds";
sort(str.begin(), str.end()); // 字符串中的字符小到大排序.
// begin 和 end 迭代器所有标准容器都有. 范围就是[begin, end)追问好的,谢谢了。明天向老师解释解释。。。我就不行还会继续死掉。。。。
全部回答
- 1楼网友:酒者煙囻
- 2021-02-02 15:16
last不算的,因为sort函数要求的是两个指针地址,假设,char ch[5].....;那么排序的时候就是,ch,ch+6追问关键是这样说老师不干啊。。。他要我说出原因。。。我想应该只有去查sort()的内部结构了吧?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯