Не можете скомпилировать структуру сортировки слиянием дерева? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался реализовать структуру дерева сортировки слиянием, но всякий раз, когда я пытаюсь слить дочерний вектор с родительским вектором, я получаю ошибку компиляции. Я застрял здесь.

 class merge_sort_tree {

    vector<int>input;
    vector<vector<int> >tr;
    int n;
public:

    merge_tree(vector<int >p) {
        n = p.size();
        input = p;
        tr.resize(5 * n);
    }

    void build(int root, int l, int r) {
        if (l == r)
        {
            tr[root] = {input[l]};
        }

        int m = l + (r - l) / 2;

        build(2 * root, l, m);
        build(2 * root + 1, m + 1, r);

       //temporary vector for merging child vectors 

        vector<int>tmp(tr[2 * root].size() + tr[2 * root + 1].size());  

       // merging child vector and storing result in tmp

        merge(tr[2 * root].begin(), tr[2 * root].end(),
              tr[2 * root + 1].begin(), tr[2 * root + 1].end(),
              tmp.begin(), tmp.end() );

         tr[root]=tmp;
    }
};

enter image description here

В файле, включенном в c: \ mingw \ lib \ gcc \ mingw32 \ 6.3 .0 \ include \ c ++ \ bits \ stl_algobase.h: 71: 0 из c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ bits \ char_traits.h: 39, из c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ ios: 40, c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ mingw32 \ bits \ stdc ++. h: 52 из C: \ Users \ Ayuu \ Desktop \ codes \ test3. cc: 1: c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ bits \ предопределенный_ops.h: в экземпляре 'constexpr bool __gnu_cxx :: __ ops :: _ Iter_comp_iter <_Compare> :: operator () (_ Iterator1, _Iterator2) [с _Iterator1 = __gnu_cxx :: __ normal_iterator>; _Iterator2 = __gnu_cxx :: __ normal_iterator>; _Compare = __gnu_cxx :: __ normal_iterator>] ': c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ bits \ stl_al go .h: 4751: 14: требуется из' _OutputIterator std: : __ merge (_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator, _Compare) [with _InputIterator1 = __gnu_cxx :: __ normal_iterator>; _InputIterator2 = __gnu_cxx :: __ normal_iterator>; _OutputIterator = __gnu_cxx :: __ normal_iterator>; _Compare = __gnu_cxx :: __ ops :: _ Iter_comp_iter <__ gnu_cxx :: __ normal_iterator>>] 'c: \ mingw \ lib \ gcc \ mingw32 \ 6.3.0 \ include \ c ++ \ bits \ stl_al go .h: 4858: 37: требуется от '_OIter std :: merge (_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare) [с _IIter1 = __gnu_cxx :: __ normal_iterator>; _IIter2 = __gnu_cxx :: __ normal_iterator>; _OIter = __gnu_cxx :: __ normal_iterator>; _Compare = __gnu_cxx :: __ normal_iterator>] 'C: \ Users \ Ayuu \ Desktop \ codes \ test3. cc: 43: 38: необходимо отсюда c: \ mingw \ lib \ gcc \ mingw32 \ 6.3. 0 \ include \ c ++ \ bits \ предопределенный_ops.h: 123: 18: ошибка: нет совпадения для вызова '(__gnu_cxx :: __ normal_iterator>) (int &, int &)' {return bool (_M_comp (* __ it1, * __ it2)) ; }

1 Ответ

1 голос
/ 22 апреля 2020

Посмотрите на эту строку, она ожидала одного итератора, вы дали 2 ошибки: нет совпадения для вызова '(__gnu_cxx :: __ normal_iterator>) (int &, int &)' {return bool (_M_comp (* __ it1, * __ it2)) ; }

Удалите tmp.end () из функции слияния. Требуется 5 аргументов, а не 6.

    merge(tr[2 * root].begin(), tr[2 * root].end(),
          tr[2 * root + 1].begin(), tr[2 * root + 1].end(),
          tmp.begin());

Это должно работать.

...