sort 和16的问题,奇怪

newlily2000 2004-08-28 06:30:14
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool CompareVString(vector< string > V1, vector< string > V2)
{
return true;
}
int main(int argc, char* argv[])
{
vector< vector< string > >VV;

for(int i=0;i<16;i++)
{
vector< string > V;
V.push_back("d");

VV.push_back(V);
}

sort(VV.begin(),VV.end(),CompareVString);

return 0;
}
其中,16改成17以上,就不好使了,异常,怎么办,原因是什么呢?盼讨论
...全文
219 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
短歌如风 2004-08-31
  • 打赏
  • 举报
回复
>//为什么会无限迭代下去呢?如果到了Iterator_end没有找到不就完了吗?

这正是为什么在16个时不出错的原因,因为这时用的是insertion_sort,它是顺序查找然后插入的。而当大于16时将使用intro_sort,它的开始是quick_sort,两个标记向中间移动直到相遇,标记的移动完全取决于比较结果,无论你的comp返回值都是true,都可能导致标记永远——它永远找不到满足移动条件的情况,当然永远是false不会导致这一情况,因为这时就相当于所有元素都相等。

comp必须满足以下三个条件:
comp(a, b) -> ! comp(b, a);
comp(a, b) && comp(b, c) -> comp(a, c);
!comp(a, a);
否则sort的行为“未定义”。
可以看出comp永真时是不满足的,但永假可以。
Andy84920 2004-08-31
  • 打赏
  • 举报
回复
to:rtdb(东临碣石)
因为DEFAULT是递增排序, 那么
return false;就不会导致交换数据了
//由于用户提供的比较函数是为了实现“小于”语义(freefalcon也这么讲).
//那么return false才会交换数据呀.而return true就代表小于了呀,默认的就是递增
//就是需要小于呀,那么就不会交换数据呀...?

to:freefalcon
由于comp总是返回true,也就是小于为真,这样算法永远也找不到,iterator无限叠代下去,直到出现非法内存访问,
//为什么会无限迭代下去呢?如果到了Iterator_end没有找到不就完了吗?
//你的意思是说由于要和中间元素进行比较,那么最后一个比中间元素大的那么元素其实现在
//比它小了,因为比较顺序变了,但如果找不到不就算了吗?还不太懂...
Andy84920 2004-08-30
  • 打赏
  • 举报
回复
为什么我的没有_SORT_MAX定义呀?如:
root@wizard[/usr/include/c++/3.3]#find ./ -exec grep -q '_SORT_MAX' '{}' \; -print
root@wizard[/usr/include/c++/3.3]
freefalcon 2004-08-30
  • 打赏
  • 举报
回复
1. const int _SORT_MAX = 16 在algorithm头文件中定义,作用前面已经说了,采用不同的算法是为了使排序更高效

2. 看一看源码就知道了,下面简单的描述一下算法的过程
首先要明白用户提供的比较函数是为了实现“小于”语义
当元素个数超过16个时,算法首先比较第一个元素、中间一个元素和最后一个元素的大小,从中找出大小居中的一个,由于comp函数返回true,所以得到的是中间的那个元素
算法然后从第一个元素开始,试图找到第一个大于中间元素的元素,但由于comp总是返回true,也就是小于为真,这样算法永远也找不到,iterator无限叠代下去,直到出现非法内存访问,程序也就over了
rtdb 2004-08-30
  • 打赏
  • 举报
回复
For simple testing, just change
return true;
TO
return false;

因为DEFAULT是递增排序, 那么
return false;就不会导致交换数据了。

若总是return true;
很多排序算法无法正常工作(可能总是要交换数据)
Andy84920 2004-08-30
  • 打赏
  • 举报
回复
因为定义了 const int _SORT_MAX = 16
//这句是什么意思啊?
TO:freefalcon
为什么一定要提供一个规则呢?我只想实验一下直接不管什么情况都返回true不可以吗?
也就是我可以在sort之后还是乱的也行哪.有何不可?
另外:_SORT_MAX = 16是哪里定义的呀?为什么需要这个定义?
roy 2004-08-30
  • 打赏
  • 举报
回复
vector< vector< string > >VV;
好像相当于string[][]吧
programfanny 2004-08-30
  • 打赏
  • 举报
回复
学习一下
Andy84920 2004-08-30
  • 打赏
  • 举报
回复
上午看到了这个threshold...的,没懂.
谢谢freefalcon.:)
freefalcon 2004-08-30
  • 打赏
  • 举报
回复
to: Andy84920

_SORT_MAX是vc中的

SGI STL用的是
const int __stl_threshold = 16;
位于stl_algo.h中
sharkhuang 2004-08-30
  • 打赏
  • 举报
回复
的确 _SORT_MAX 所采用的排序方法有关系.
同意 rtdb(东临碣石) ( )
steel007 2004-08-28
  • 打赏
  • 举报
回复
你程序的问题,sort需要你提供的规则满足一定的条件:
sort
template<class RanIt>
void sort(RanIt first, RanIt last);
template<class RanIt, class Pr>
void sort(RanIt first, RanIt last, Pr pred);
The first template function reorders the sequence designated by iterators in the range [first, last) to form a sequence ordered by operator<. Thus, the elements are sorted in ascending order.

A sequence of elements designated by iterators in the range [first, last) is ``a sequence ordered by operator<'' if, for each N in the range [0, last - first) and for each M in the range (N, last - first) the predicate !(*(first + M) < *(first + N)) is true. (Note that the elements are sorted in ascending order.) The predicate function operator<, or any replacement for it, must not alter either of its operands. It must yield the same boolresult every time it is evaluated, and it must yield the same result if a copy of either operand is substituted for the operand. Moreover, it must impose a strict weak ordering on the operands it compares.

你的比较规则总是返回true,当然会出问题了~
freefalcon 2004-08-28
  • 打赏
  • 举报
回复
另外:_SORT_MAX = 16 是用于控制排序方法的选择的,当元素个数小于16时,采用插入排序,大于16时好像是采用快速排序法
freefalcon 2004-08-28
  • 打赏
  • 举报
回复
你程序的问题
CompareVString应该提供一个vector<string>比较的具体规则,即什么情况为true,什么情况为false,不能一味的都是true
你的目的应该只是测试一下吧,但测试也不要偷懒
newlily2000 2004-08-28
  • 打赏
  • 举报
回复
因为定义了 const int _SORT_MAX = 16 那我怎么超过之后就不好使,是我做的不对,还是,stl的问题

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧