#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
для avector<T>
, поэтому ссылкой на n-й элемент является aTamp;
, а не avector<T>amp;
.5.
amp;preorder[index]
— Этоint *
, т.е. указатель на одинint
. Вам действительно следует лучше ознакомиться с типами, с которыми вы имеете дело. Вы используете термины «ссылка», когда у вас есть адреса / указатели. В C ссылка имеет определенное значение, и это не означает «указатель». Вектор — это класс, который является оболочкой для динамического массива. Получение «указателей внутри него» не дает вам «урезанную» версию вектора. Я думаю, что именно здесь вы написали код с этим ошибочным представлением.