Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?
P>Будем считать, что жара совсем съела мозг, и потому я так туплю Имеется структура следующего вида:
Что-то я не понял этого вида. Почему num — вектор, а дети живут в статическом массиве? Неразумно.
P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?
А что значит "правильно" и о каких проблемах ты беспокоишься?
Здравствуйте, Vamp, Вы писали:
V>А что значит "правильно" и о каких проблемах ты беспокоишься?
У меня по каким-то причинам вылетала ошибка сегментации при добавлении элемента к вектору. Структура хитрая, но для моей задачи вроде довольно удобная.
Можно даже опустить слово "правильно" и спросить просто "Как написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву?"
P>Можно даже опустить слово "правильно" и спросить просто "Как написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву?"
Гм, примерно вот так:
Node* node = new Node;
parent->children[index] = node;
node->num.push_back(10);
Здравствуйте, Pils, Вы писали:
P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?
struct Node
{
std::auto_ptr<Node> children[10];
std:vector<int> num;
void AddChildAt( std::auto_ptr<Node> child, int at )
{
assert( 0 <= at && at <= lengthof( children ) );
children[at] = child;
}
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
боюсь, будут проблемы при копировании такой структуры.
auto_ptr идеально подходит для передачи параметров вместе с владением.
в других случаях — очень опасная вещь.
P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?
K13>боюсь, будут проблемы при копировании такой структуры. K13>auto_ptr идеально подходит для передачи параметров вместе с владением. K13>в других случаях — очень опасная вещь.
скорее всего работать будут с указателями на структуру, поэтому лучше сделать тип некопиабельным и не париться.
K13>боюсь, будут проблемы при копировании такой структуры. K13>auto_ptr идеально подходит для передачи параметров вместе с владением. K13>в других случаях — очень опасная вещь.
А думаешь с копированием исходной проблем не будет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Pils wrote:
> Как правильно написать на С++ инициализацию объекта типа Node и > добавление нового элемента к существующему дереву чтобы потом не > возникало проблем с памятью при добавлении неких значений в num?
Любая инициализация, вызывающая конструктор этой структуры,
будет правильной. Видимо, у тебя этого не происходило.
Вчера до описанных в теме советов так и не добрался, написал в итоге по тупому:
struct Node
{
Node* children[10];
vector <string> words;
};
Node* create_node()
{
Node* new_node = new Node;
for (int i = 0; i < 10; i++)
new_node->children[i] = NULL;
return new_node;
}
void add_node(Node* curr, int index)
{
Node* new_node = create_node();
curr->children[index] = new_node;
}
Далее в программе дерево указанным ниже образом заполняется, после заполнения сортируется массив, ну и затем по поступающим командам считываются нужные данные:
Node* tree_root = create_node();
…
for (;;)
tree_input(tree_root, input_word);
void tree_input(Node* root, string word)
{
Node* curr = root;
int key;
...
for (size_t i = 0; i < word.size(); i++)
{
key = letter_to_int(word[i]);
if (curr->children[key] == NULL)
{
add_node(curr, key);
}
curr = curr->children[key];
}
curr->words.push_back(word);
...
}
Дома под wxDev-C++ все работает нормально, но для проверки я отсылаю исходник на удаленную машину, там он автоматом компилится под линукс с помощью g++ 4.3.2 и выдает sigsegv на первом же тесте (повторюсь, на домашнем компе с этими же тестами все работает как надо). Подскажите, в чем может быть проблема и как ее исправить?
Здравствуйте, Pils, Вы писали:
P>Дома под wxDev-C++ все работает нормально, но для проверки я отсылаю исходник на удаленную машину, там он автоматом компилится под линукс с помощью g++ 4.3.2 и выдает sigsegv на первом же тесте (повторюсь, на домашнем компе с этими же тестами все работает как надо). Подскажите, в чем может быть проблема и как ее исправить?
За неимением линукса пришлось искать место возникновения проблемы тупо с помощью тестовой печати. Результаты интересные: дерево создается, все вершины и ключи на своих местах. Ошибка сегментации вылетает, когда на некотором этапе происходит вывод данных одной из вершин:
cout << curr->words[fr_count];
К этому моменту fr_count = 0; curr->words.size() = 1, нужный элемент там находится. В чем дело-то может быть