C ++ 11:`错误:在'代码'之前的'primary-expression')用于行扫描以找到最接近的对

时间:2016-07-19 14:54:46

标签: c++ c++11

这是用{+ 3}}编写的O(NlogN)解决方案,用C ++ 11编写。我用了closest pair problem。比较器可能会让人感到困惑:cmp最初按x然后y对点进行排序,而compare_ystd::complex for geometry中的点按y值排序。

以下是我得到的错误,然后是我的代码。

cp.cpp: In function ‘int main()’:
cp.cpp:49:95: error: expected primary-expression before ‘)’ token
                 for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {
                                                                                               ^
cp.cpp:49:150: error: expected primary-expression before ‘)’ token
                 for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {

#include <bits/stdc++.h>
using namespace std;

const double EPS = 1e-9;

// define x, y as real(), imag()
typedef complex<double> point;
#define x real()
#define y imag()

bool cmp(point a, point b) {
    if (a.x < b.x) return true;
    if (a.x - b.x < EPS && a.y < b.y) return true;
    return false;
}

struct compare_y {
    bool operator() (const point& lhs, const point& rhs) const{
        if (lhs.y < rhs.y) return true;
    }
};

int main() {
    int n;
    while (scanf("%d", &n) && n != 0) {

        vector<point> coord;
        for (int i=0; i<n; ++i) {
            double xi, yi;
            scanf("%lf%lf", &xi, &yi);
            point t(xi, yi);
            coord.push_back(t);
        }
        sort(coord.begin(), coord.end(), cmp);

        double h = 10000000;
        set<point, compare_y> s;
        s.insert(coord[0]);
        for (int i=1; i<n; ++i) {

            for (auto pt:s) {
                if (abs(pt-coord[i])+EPS > h) { // bound by x
                    s.erase(pt);
                }
            }
            point t1 = coord[i]; t1.imag(t1.y - h);
            point t2 = coord[i]; t2.imag(t2.y + h);
            for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {
                h = min(h, abs(*it-coord[i]));
            }


            s.insert(coord[i]);
        }
        if (h + EPS >= 10000)
            printf("INFINITY\n");
        else
            printf("%.4lf\n", h);

    }
}

1 个答案:

答案 0 :(得分:3)

首先,不要使用<bits/stdc++.h>

其次,您将成员函数std::set::lower_bound()与算法std::lower_bound()混淆 - 它们采用不同的参数。成员函数只接受一个参数(其他三个是隐含的 - 集合和比较器的范围。虽然即使对于std::lower_bound(),你也不正确地提供比较器,因为该参数需要是一个对象而你只是提供一个类型名称。

第三,sstd::set<point, compare_y>,因此这些成员函数返回std::set<point, compare_y>::iterator而不是std::set<point>::iterator

第四,std::set<point, compare_y>::iterator不是随机访问,因此没有定义operator<。您需要使用!=

正确的行是:

for (std::set<point, compare_y>::iterator it = s.lower_bound(t1); it != s.upper_bound(t2); ++it) {

或只是:

for (auto it = s.lower_bound(t1); it != s.upper_bound(t2); ++it) {