Указатели векторов с векторными срезами для генерации дерева из векторов предварительного заказа и inorder

#c #vector #tree

#c #вектор #дерево

Вопрос:

Я получаю следующую ошибку:

solution.cpp : В функции-члене buildTree Строка 26: Символ 62: ошибка: нет соответствующей функции для вызова ‘Solution::buildTree(__gnu_cxx::__alloc_черты, int>::value_type *, std::vector*)’ root->left = buildTree(amp;preorder[index],amp;inorderslice); ^

В этом коде:

 
class Solution {
public:
    TreeNode* buildTree(vector<int>amp; preorder, vector<int>amp; inorder) {
        if(preorder.empty() || inorder.empty())
            return NULL;
        if(preorder.size() == 1) // preorder and inorder should always have the same length
        {
            TreeNode *node = new TreeNode(preorder[0]);
            return node;
        }
        // current root is the first entry of preorder
        TreeNode *root = new TreeNode(preorder[0]);
        // find the index of this number in inorder
        std::vector<int>::iterator it = std::find(inorder.begin(), inorder.end(), preorder[0]);
        int index = std::distance(inorder.begin(), it);
        std::vector<int> inorderslice = std::vector<int>(inorder.begin(), inorder.begin()   index);
        root->left = buildTree(amp;preorder[index],amp;inorderslice); // This line is a problem
        root->right = buildTree(amp;preorder[index 1],amp;inorder[index 1]); // This line is a problem
        return root;

    }
};
  

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

Я пытаюсь сделать это рекурсивно, но у меня возникла проблема с сопоставлением типов переменных функции, выполняющей рекурсию.

     TreeNode* buildTree(vector<int>amp; preorder, vector<int>amp; inorder) {
  

Этот заголовок получает указатель на вектор целых чисел.

В моем алгоритме я пытаюсь нарезать входные векторы, чтобы использовать только их части в моей рекурсии:

         std::vector<int> inorderslice = std::vector<int>(inorder.begin(), inorder.begin()   index);

  

Для вектора предварительного заказа я просто хочу вырезать элементы впереди (те, что перед индексом), поэтому я подумал, что просто передам указатель на этот элемент вектора.

Для вектора inorder я хочу вырезать элементы ПОСЛЕ индекса.

В pythonic способе это было бы просто preorder[index:] inorder[:index]

Но я получаю сообщение об ошибке при вызове функции.

Как мне это сделать на C ?

Спасибо.

Ответ №1:

Ваши функции принимают ссылки; вы передаете указатели.

Здесь возникает путаница в отношении того, что amp; означает.

Это любой из:

  • побитовый оператор AND при применении между двумя выражениями
  • оператор «address-of» при применении к одному оператору, в результате чего указатель
    • это то, что вы делаете в своих вызовах функций
  • «ссылка» при добавлении к имени типа
    • это то, что вы вводите в параметры своей функции

Короче говоря, удалите amp; из своих вызовов и просмотрите главу в своей книге по C об использовании ссылок.

Этот заголовок получает указатель на вектор целых чисел.

Нет, это не так.

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

1. Это то, о чем я сначала подумал. На самом деле, у меня это было без amp; в начале, но без него я получаю эту ошибку: solution.cpp : нет соответствующей функции для вызова ‘Solution::buildTree(__gnu_cxx::__alloc_черты<std::распределитель<int>, int>::value_typeamp;, std::vector<int>amp;)’ root->left = buildTree(предварительный заказ[индекс],inorderslice); // Эта строка является проблемой ^

2. Вам нужно более тщательно продумать свои типы данных. Ваша функция принимает векторы, но вы передаете ей целые числа? Почему? Возможно, вам следует переключиться на диапазоны итераторов?

3. Я пытаюсь передать ссылку на определенный индекс в векторе. Я только начал c и действительно не знаю, как использовать итераторы. Невозможно ли сделать то, что я пытаюсь сделать, без итераторов?

4. @JoaoAntunes Значит, ссылка на n-й элемент вектора не является ссылкой на вектор? — Нет. n-й элемент вектора имеет тип T для a vector<T> , поэтому ссылкой на n-й элемент является a Tamp; , а не a vector<T>amp; .

5. amp;preorder[index] — Это int * , т.е. указатель на один int . Вам действительно следует лучше ознакомиться с типами, с которыми вы имеете дело. Вы используете термины «ссылка», когда у вас есть адреса / указатели. В C ссылка имеет определенное значение, и это не означает «указатель». Вектор — это класс, который является оболочкой для динамического массива. Получение «указателей внутри него» не дает вам «урезанную» версию вектора. Я думаю, что именно здесь вы написали код с этим ошибочным представлением.