c++ 的lambda表达式,该如何解决
c++ 的lambda表达式
很奇怪的问题,数组短一点没有问题,数组长一点就出错退出,什么原因呢?
手头没有c++ 11的编译器,,,没法单步。。。
请教:
代码如下:
len=10就没问题,但是len=100就报错。
------解决思路----------------------
<= 改成 < 即可
void sort( RandomIt first, RandomIt last, Compare comp ) 要求当a < b 时才返回true,其他情况均应返回false
------解决思路----------------------
改成:
------解决思路----------------------
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--) 循环,这是从向量尾部逆序向前遍历,说来说去你要从大到小遍历元素,那之前排序的时候直接降序排就行了。
------解决思路----------------------
strict weak ordering
------解决思路----------------------
不能写等于,他判断等于是通过a不小于b,同时b不小于a,你写成小于等于时,a与b相等的情况会出现a又小于b,b又小于a,去看侯捷的《泛型编程与STL》, 上面解释的很清楚
很奇怪的问题,数组短一点没有问题,数组长一点就出错退出,什么原因呢?
手头没有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就报错。
------解决思路----------------------
<= 改成 < 即可
void sort( RandomIt first, RandomIt last, Compare comp ) 要求当a < b 时才返回true,其他情况均应返回false
------解决思路----------------------
改成:
sort(v.begin(), v.end(), [](int a, int b)
{return to_string(a) + to_string(b) < to_string(b) + to_string(a);});
------解决思路----------------------
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--) 循环,这是从向量尾部逆序向前遍历,说来说去你要从大到小遍历元素,那之前排序的时候直接降序排就行了。
------解决思路----------------------
strict weak ordering
------解决思路----------------------
不能写等于,他判断等于是通过a不小于b,同时b不小于a,你写成小于等于时,a与b相等的情况会出现a又小于b,b又小于a,去看侯捷的《泛型编程与STL》, 上面解释的很清楚