我知道关于这个的帖子很少,所以随时删除我的帖子,但是这段代码:
#include <bits/stdc++.h>
#define tol 1e-9
using namespace std;
int n;
vector<pair<double,double>> vec;
struct comparator {
bool operator () ( pair<double,double> &a, pair<double,double> &b ) {
if ( fabs(a.first-b.first) < tol )
return a.second < b.second;
return a.first > b.first;
}
};
int main() {
int i,j,k,ts,cs= 0,m,sz;
for ( ; 1 == scanf("%d",&n); ) {
for ( vec.clear(), vec.reserve(n), i = 0; i < n; ++i )
scanf("%lf %lf",&vec[i].second,&vec[i].first);
sort(vec.begin(),vec.end(),comparator());
for ( i = 0; i < n; ++i )
printf("%lf %lf\n",vec[i].first,vec[i].second);
}
return 0;
}
不适用于此示例:
2
120 60
60 90
我将其编译为g++ -std=c++11 -o a mwe.cpp
,我的是g++ version 5.4
答案 0 :(得分:0)
您将resize()
与reserve()
混淆了。
写作时
for ( vec.clear(), vec.reserve(n), i = 0; i < n; ++i )
您为向量n
保留了大小vec
,即您正在指示vec
为将来扩展到n
元素保留内存大小。但是,目前,vec
的大小仍为零。
所以,当你写
scanf("%lf %lf",&vec[i].second,&vec[i].first);
你正在写未初始化的对象。
非常非常糟糕。
从技术上讲:你在UB(未定义行为)。
实际上说:一切都可以发生。
写作时
sort(vec.begin(),vec.end(),comparator());
您正在对零大小的向量vec
进行排序,其中vec.begin()
等于vec.end()
。
换句话说:std::sort()
绝对不做任何事。
解决方案:避免使用clear()
(正如Caleth指出的那样,如果您在resize()
后重置并重置所有元素,这是多余的)并使用resize()
代替reserve()
// -------vvvvvv
for ( vec.resize(n), i = 0; i < n; ++i )
关闭主题建议:
bits/stdc++.h
std::scanf()
和std::printf()
并使用std::cin
和std::cout
。答案 1 :(得分:0)
我认为你应该真正按照我的条件 - 笔迹工作。该片段看起来真的难以理解。循环初始化器中有如此多的语句。第三个循环可以使用基于范围的语法。我尽可能避免传统的for循环。 您可以在开始时保留并继续使用push_back,直到假定的容量为止。