c++ 的lambda表达式

quickSort 2015-09-05 08:58:06
很奇怪的问题,数组短一点没有问题,数组长一点就出错退出,什么原因呢?
手头没有c++ 11的编译器,,,没法单步。。。
请教:
代码如下:
// Example program
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>


using namespace std;

string largestNumber(vector<int> & v)
{
sort(v.begin(), v.end(), [](int a, int b)
{return to_string(a) + to_string(b) <= to_string(b) + to_string(a);});

string ans;

for(int i = v.size() - 1; i>=0; i--)
ans += to_string(v[i]);

return ans;
}


int main()
{
vector<int> a;
int len = 100;
for(int i=0; i<len; i++)
a.push_back(1);

string n;
n = largestNumber(a);

cout<< "res:" << n << endl;

return 0;
}


len=10就没问题,但是len=100就报错。
...全文
219 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2015-09-07
  • 打赏
  • 举报
回复
mujiok2003 2015-09-07
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
[quote=引用 8 楼 hello_world_2012 的回复:] [quote=引用 4 楼 ri_aje 的回复:] sort 的比较式应该用小于。也可以用大于,这样后面就不用逆序遍历了。
不能写等于? 能解释下吗?没看懂后面的逆序遍历[/quote] c++ 要求喂给标准算法的比较运算能够保证 strict weak ordering,后者的条件之一就是不具有自反性,即 compare(x,x) 对任意值为假。主楼定义的 to_string(a) + to_string(b) <= to_string(b) + to_string(a); 没有这种性质,因为 to_string(x) + to_string(x) <= to_string(x) + to_string(x); 总为真。把这样的比较函数扔给 sort 会导致未定义行为,这就是为啥主楼的程序有的时候挂,有的时候看似能运行。 逆序遍历说的是后面的 for(int i = v.size() - 1; i>=0; i--) 循环,这是从向量尾部逆序向前遍历,说来说去你要从大到小遍历元素,那之前排序的时候直接降序排就行了。[/quote] ++
赵4老师 2015-09-07
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
[quote=引用 8 楼 hello_world_2012 的回复:] [quote=引用 4 楼 ri_aje 的回复:] sort 的比较式应该用小于。也可以用大于,这样后面就不用逆序遍历了。
不能写等于? 能解释下吗?没看懂后面的逆序遍历[/quote] c++ 要求喂给标准算法的比较运算能够保证 strict weak ordering,后者的条件之一就是不具有自反性,即 compare(x,x) 对任意值为假。主楼定义的 to_string(a) + to_string(b) <= to_string(b) + to_string(a); 没有这种性质,因为 to_string(x) + to_string(x) <= to_string(x) + to_string(x); 总为真。把这样的比较函数扔给 sort 会导致未定义行为,这就是为啥主楼的程序有的时候挂,有的时候看似能运行。 逆序遍历说的是后面的 for(int i = v.size() - 1; i>=0; i--) 循环,这是从向量尾部逆序向前遍历,说来说去你要从大到小遍历元素,那之前排序的时候直接降序排就行了。[/quote] 专业!
ri_aje 2015-09-07
  • 打赏
  • 举报
回复
引用 8 楼 hello_world_2012 的回复:
[quote=引用 4 楼 ri_aje 的回复:] sort 的比较式应该用小于。也可以用大于,这样后面就不用逆序遍历了。
不能写等于? 能解释下吗?没看懂后面的逆序遍历[/quote] c++ 要求喂给标准算法的比较运算能够保证 strict weak ordering,后者的条件之一就是不具有自反性,即 compare(x,x) 对任意值为假。主楼定义的 to_string(a) + to_string(b) <= to_string(b) + to_string(a); 没有这种性质,因为 to_string(x) + to_string(x) <= to_string(x) + to_string(x); 总为真。把这样的比较函数扔给 sort 会导致未定义行为,这就是为啥主楼的程序有的时候挂,有的时候看似能运行。 逆序遍历说的是后面的 for(int i = v.size() - 1; i>=0; i--) 循环,这是从向量尾部逆序向前遍历,说来说去你要从大到小遍历元素,那之前排序的时候直接降序排就行了。
quickSort 2015-09-07
  • 打赏
  • 举报
回复
引用 4 楼 ri_aje 的回复:
sort 的比较式应该用小于。也可以用大于,这样后面就不用逆序遍历了。
不能写等于? 能解释下吗?没看懂后面的逆序遍历
quickSort 2015-09-07
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
不支持C++11 可以写仿函数啊 比较函数写的不对啊
改成小于后确实没问题了,但是为什么呢? 我希望等于的时候也返回true,我这样写有什么问题?
paschen 版主 2015-09-07
  • 打赏
  • 举报
回复
不能写等于,他判断等于是通过a不小于b,同时b不小于a,你写成小于等于时,a与b相等的情况会出现a又小于b,b又小于a,去看侯捷的《泛型编程与STL》, 上面解释的很清楚
paschen 版主 2015-09-06
  • 打赏
  • 举报
回复
改成:

sort(v.begin(), v.end(), [](int a, int b) 
        {return to_string(a) + to_string(b) < to_string(b) + to_string(a);});
  • 打赏
  • 举报
回复
不支持C++11 可以写仿函数啊 比较函数写的不对啊
ri_aje 2015-09-06
  • 打赏
  • 举报
回复
sort 的比较式应该用小于。也可以用大于,这样后面就不用逆序遍历了。
iyomumx 2015-09-05
  • 打赏
  • 举报
回复
<= 改成 < 即可 void sort( RandomIt first, RandomIt last, Compare comp ) 要求当a < b 时才返回true,其他情况均应返回false
quickSort 2015-09-05
  • 打赏
  • 举报
回复
引用 1 楼 useprlove 的回复:
我使用VS2010无法编译,提示to_string调用不明确。你试下给to_string的参数加强制类型转换:
把所有
to_string(
改成
to_string((_ULonglong)
VS2010应该对C++ 11的支持可能不是太好吧? 我在测试时发现的问题是,当传递的vector很大时,异常退出,但是vector长度较小时一切正常。
useprlove 2015-09-05
  • 打赏
  • 举报
回复
我使用VS2010无法编译,提示to_string调用不明确。你试下给to_string的参数加强制类型转换:
把所有
to_string(
改成
to_string((_ULonglong)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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