이게 왜 VS 2010 에서는 컴파일이 안될까요? ㅠㅠ

  • zzapcoder
    zzapcoder

    #ㅠㅠ 알고리즘 문제해결전략
    에서 나온거와 거의 똑같이 짠 Treap 코드이고,
    삽입정렬 뒤집기 문제를 풀려고 짠겁니다.

    에러메시지도 utility 163 에 문제가 있다는 걸 보니 제가 pair 를 잘못 쓴것 같기도 해서...

    • '초기화 중' : 'int'에서 'Node *'(으)로 변환할 수 없습니다.
    • 'std::_Pair_base<_Ty1,_Ty2>::second' : 멤버를 초기화할 수 없습니다.

    대강 이런 오류가 두개씩 나와여(퍼스트 한개 세컨드 한개인듯)

    그래서 nodePair 반환을 make_pair 같은 식으로도 해보고... 그랬는데요. 그래도 안 되네요.

    결국 뭔지는 알아야겠고,
    제가 한글 버전을 쓰는지라,
    한글 오류메세지는 구글링도 안 되겠다싶어서
    다른 오류메세지를 보려고 제출을 해버렸는데 웬걸
    알고스팟 온라인저지에서는 그냥 정답처리되네요 ㅠㅠ

    왜 VS2010 에서는 오류가 날까요?
    또 무슨 차이가 있는걸까요?

    궁금합니다. 능력자 여러분 가르쳐주세여 ㅠㅠ

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <ctime>
    #include <cstdio>
    #include <utility>
    
    using namespace std;
    
    
    typedef int keyType ;
    
    struct Node{
        keyType key ; // elements in node
    
        int priority , 
            size ; // size : size of the tree, which has this node as a Root.
    
        Node *left, *right ; // children
    
        Node (const keyType& _Key) : key(_Key), priority (rand()), size(1), left(NULL), right(NULL)
        {}
    
        void calcsize(){
            size = 1;
            if(left) size +=  left->size ;
            if(right) size +=right->size ;
        }
    
        void setLeft (Node* newl){
            left = newl ;
            calcsize() ;
        }
        void setRight(Node* newr){
            right= newr ;
            calcsize() ;
        }
    };
    
    typedef pair<Node*,Node*> nodePair ;
    
    nodePair split(Node* root, keyType key){
        if(root == NULL) return nodePair(NULL,NULL);
    
        //루트가 key 미만이면 right sub tree 를 split
        if(root->key < key){
            nodePair rs = split(root->right , key);
            root->setRight(rs.first) ;
            return make_pair(root, rs.second) ;//////////////////////////////////////
        }
    
        //루트가 key 이상이면 왼쪽 서브트리를 쪼갠다
        nodePair ls = split(root->left , key) ;
        root->setLeft(ls.second) ;
        return make_pair(ls.first , root) ;//////////////////////////////////
    }
    //이 함수는 이렇게 쓰세요 : root = insert(root, new Node(키값)) ;
    Node* insert(Node* root, Node* node){
        if(root == NULL) return node;
        // 루트를 교체하는 경우
        if(root->priority < node->priority){
            nodePair splitted = split(root, node->key );
            node->setLeft(splitted.first) ;
            node->setRight(splitted.second) ;
            return node ;
        }
        else if(node -> key < root->key){
            root -> setLeft(insert(root->left , node));
        }
        else
            root->setRight(insert(root->right , node));
    
        return root ;
    }
    
    //노드 삭제 및 합치기 연산
    Node* merge(Node* a, Node* b){
        if(a==NULL) return b;
        if(b==NULL) return a;
        if(a->priority < b->priority){
            b->setLeft(merge(a , b->left));
            return b;
        }
        a->setRight(merge(a->right , b) );
        return a;
    }
    
    Node* erase (Node* root, keyType key){
        if(root == NULL) return root;
        if(root->key == key){
            Node* ret = merge(root->left , root->right) ;
            delete root ;
            return ret ;
        }
        if (key < root->key)
            root->setLeft(erase(root->left , key)) ;
        else
            root->setRight(erase(root->right,key)) ;
        return root;
    }
    
    Node* kth(Node* root,int k){
        int leftSize = 0;
        if(root->left != NULL) leftSize = root->left->size ;
    
        if(k <= leftSize) return kth(root->left , k);
        if(k == leftSize+1)return root ;
        return kth(root->right , k - leftSize-1) ;
    }
    int countLessThan(Node* root, keyType key){
        if(root == NULL) return 0;
        if(root->key >= key)
            return countLessThan (root->left , key) ;
        int ls = (root->left ? root->left->size : 0);
        return ls + 1 + countLessThan(root->right, key) ;
    }
    
    
    int shift[50001] ;
    int first[50001] ;
    
    int main (){
        srand((unsigned)time(NULL));
    int tc ; cin>>tc ;
    while(tc--){
        int n;
        scanf("%d",&n) ;
        Node* rt = NULL ;
    
        for(int i=0;i<n;++i){
            scanf("%d",&shift[i]) ;
            rt = insert(rt,new Node(i+1) );
        }
    
        for(int i = n-1; i >= 0 ; --i){
            int k = i - shift[i] + 1 ;
            Node* tmp = kth(rt , k) ;
            int Erase = tmp->key ;
            first[i] = Erase ;
            rt = erase(rt , Erase) ; 
            //답을 구해염
        }
    
        for(int i=0;i<n;++i){
            printf("%d ",first[i]) ;
        }printf("\n") ;
    
        //delete rt ;
    }
        return 0;
    }
    

    7년 전
13개의 댓글이 있습니다.
  • zzapcoder
    zzapcoder

    왜 소스코드가 포장이 안되는걸까여? ㅠㅠㅠ


    7년 전 link
  • VOCList
    VOCList

    한줄씩 떼봐여


    7년 전 link
  • VOCList
    VOCList

    는 그니까 ~~~ c++ 아래 한줄 띄고 코드쓰고 마지막 ~~~ 쓰기 전에도 한줄 띄고..


    7년 전 link
  • zzapcoder
    zzapcoder

    오 됐다 감사해여


    7년 전 link
  • VOCList
    VOCList

    NULL이 int값 0으로 치환이 될텐데 그럼 위 코드에서 NULL을 넣는 부분이 0값을 넣는 코드로 변하게 되고, 형 체크가 엄밀하게 이루어지면 혹시 이 부분에 문제 제기가 가능하지 않나 추측만... 포인터에 널 쓰는건 흔히 하는 일이긴 한데말이지여.
    널 대신 안 쓰는 노드하나 만들어서 걔 포인터를 대신 써보시는건 어떤가여.


    7년 전 link
  • Being
    Being

    C++ 고수님을 소환해야 맞겠지만 대충 느낌으로는 make_pair가 template type inference를 활용해서 std::pair<T1, T2>(a, b) 이렇게 써야 할 것을 make_pair(a, b)로 줄일 수 있는 녀석인데요, 문제는 make_pair(NULL, NULL)에서 NULL의 타입이 뭐냐? 라는 것을 컴파일러가 잘 알아내지 못한 걸로 보입니다.


    7년 전 link
  • Being
    Being

    음 그런데 이미 make_pair는 안 쓰시는군요....


    7년 전 link
  • MiNu
    MiNu

    위에 VOCList, Being 님이 써주신 대로 pair에서 NULL이 문제가 되는 것 같네요.
    일단 return nodePair(new Node(0),new Node(0)); 처럼 쓰시면 컴파일 오류는 해결됩니다.


    7년 전 link
  • MiNu
    MiNu

    http://msdn.microsoft.com/ko-kr/library/vstudio/bb531344(v=vs.100).aspx
    참고로 위 글을 보면 VS2010에서는 NULL 대신 return nodePair(nullptr, nullptr); 처럼 쓰면 된다고 합니다.


    7년 전 link
  • zzapcoder
    zzapcoder

    와 대박... 정말 그대로네여..
    nullptr 로 바꾸니까 해결됐어요!
    감사합니다!


    7년 전 link
  • JongMan
    JongMan

    훌륭한 답변력이당


    7년 전 link
  • Signin
    Signin

    좋은 답변 감사합니다~!
    왠지 알고스팟에는 이 답변이 있을 것 같았는데 역시 맞네요ㅎㅎ


    6년 전 link
  • rs1234
    rs1234

    우와 감사합니다


    5년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.