определение алгоритма Дейкстры с помощью библиотеки STL

#c #compiler-errors

#c #ошибки компилятора

Вопрос:

здесь код для алгоритма Дейкстры с использованием макросов и библиотеки STL

 #include<iostream>
#include<vector>
#include<set>
#include<list>
#include<map>
#include<queue>
#include<algorithm>
#include<utility>
using namespace std;
vector<vector<pair<int,int> > >G;
/*
  definitions:
  G.size-number of vertices
  G[i].size() is number of vertices directly reachable from vertex with index i
  G[i][j].first  is index of j-th vertex reachable from vertex i
  G[i][j].second  is length of edge heading  from vertex to vertex G[i][j].first
*/

#define N 6
typedef pair<int,int> ii;
typedef vector<ii> vii;
typedef vector<vii>vvii;
#define size(a) int ((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,it) for(typeof((c).begin() it=(c).begin();it!=(c).end();it  ));
#define present(c,x) ( (c).find(x)!=(c).end())
#define cpresent(c,x) (find(all(c),x)! =(c).end())
typedef vector<int>vi;
priority_queue<ii,vector<ii>,greater<ii> >Q;
vi D(N,987654321);

void dijkastra(){
    D[0]=0;
    Q.push(ii(0,0));
    while(!Q.empty()){
        ii top=Q.top();
        Q.pop();
        int v=top.second,d=top.first;
        /*
         // this check is very important
        // we analyze each vertex only once
        // the other occurrences of it on queue (added earlier) 
        // will have greater distance
                            */
        if(d<=D[v]){
            //iterate through all outcoming edge from v
            tr(G[v],it){
            }
        }
    }
}

int main(){
    return 0;
}
  

Когда я его компилирую, он выдает следующие ошибки:

 macros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2146: syntax error : missing ')' before identifier 'it'
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C3861: 'typeof': identifier not found
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2065: 'it' : undeclared identifier
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2065: 'it' : undeclared identifier
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2143: syntax error : missing ';' before ')'
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2143: syntax error : missing ';' before ')'
>c:usersdatodocumentsvisual studio 2010projectsallmacros_disktraallmacros_disktraallmacros_disktra.cpp(49): error C2059: syntax error : ')'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  

Я не понимаю, где ошибка.

Комментарии:

1. Это месть Дейкстры за то, что его называют дикстрой и дейкастрой.

2. Пожалуйста, отформатируйте код лучше и не злоупотребляйте макросами C , это затрудняет чтение вашего кода.

3. Это для какого-то нового IOC CC или для чего еще нужны эти макросы?

4. нет, это просто самостоятельно определенные макросы, они предназначены для конкретных контейнеров, конкретных итераторов

Ответ №1:

Проблема в:

 #define tr(c,it) for(typeof((c).begin() it=(c).begin();it!=(c).end();it  ));
  

typeof( не имеет соответствия )

Вы также можете рассмотреть возможность использования typedef для таких вещей, как итераторы и сложные типы STL, т. е.

 typedef vector<pair<int,int> > vpairs;
typedef vector<vpairs > vvpairs;
typedef vpairs::iterator vp_iter;
typedef vvpairs::iterator vvp_iter;
vvpairs G;
  

И если вы действительно хотите использовать макросы, то:

 #define tr_vp(c,it) for(vp_iter it=(c).begin();it!=(c).end();it  )
#define tr_vvp(c,it) for(vvp_iter it=(c).begin();it!=(c).end();it  )
  

Комментарии:

1. как я могу это решить? каков правильный способ написания этого определения макроса?

2. Также ваш #define tr (c, it) имеет «;» в конце, что, вероятно, будет иметь нежелательные последствия (блок оператора «for» не будет выполняться под ним).

3. извините, я ушел, я проверил этот код и тоже не работает, та же ошибка

4. у #define тоже был дополнительный) в конце. Также из вашего кода вы пытаетесь выполнить итерацию через G[V], которая будет иметь тип vector<pair<int,int> > . Смотрите обновленный код. Используйте tr_vp вместо вашего tr.

5. пожалуйста, посмотрите эту ссылку community.topcoder.com /…