Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка с классами и вектором 
:(
    Опции темы
murzilka6002
Дата 14.11.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



при компиляции кода ошибок и варнингов не выдает.
Но при запуске система выбивает ошибку. "Инструкция по адресу "0x0042cee0" обратилась к памяти по адресу "0x00000004". Память не может быть "reed".
Посмотрите, что может быть не так в коде?


Код

#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class tree_node
       {
       public:
        string data;
        vector <string> children;
        };
        
int main(int argc, char *argv[])
{
tree_node root;

root.data="root_korzen";
root.children[1]="t_02";

    cout<<root.data<<" ";
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


PM MAIL   Вверх
boostcoder
Дата 14.11.2011, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(murzilka6002 @  14.11.2011,  13:12 Найти цитируемый пост)
root.children[1]

таким образом ты получаешь доступ к первому элементу. но вектор же пустой. тут и происходит ошибка.

Добавлено через 1 минуту и 6 секунд
http://liveworkspace.org/code/a2216c6386c6...dbb8858c8066889
PM WWW   Вверх
murzilka6002
Дата 14.11.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



ой.... я что-то....да. Большое спасибо smile

Добавлено через 8 минут и 41 секунду
А тогда ещё вопрос. Если потом я хочу перебирать(выводить) данные вектора, но предварительно я не знаю сколько их там есть. И если в цикле я попаду на несуществующему элементу - будет выдавать ошибку. Как это прописать?
так не подойдет 
Код

if (root.children[i]==NULL)
{
}


Это сообщение отредактировал(а) murzilka6002 - 14.11.2011, 13:23
PM MAIL   Вверх
murzilka6002
Дата 14.11.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



и ещё, как можно сделать потом "навигацию" по классам, то есть:

Код

string a;
cin>>a;
tree_nod * a;
cout<< a.data<<endl;


я конечно не правильно записал, но просто хотел суть передать.
PM MAIL   Вверх
azesmcar
Дата 14.11.2011, 14:05 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(murzilka6002 @  14.11.2011,  13:21 Найти цитируемый пост)
И если в цикле я попаду на несуществующему элементу - будет выдавать ошибку. Как это прописать?

Как ты это сделаешь? Размер вектора ты знаешь, делай итерацию по количеству элементов в вектор, и вообще используй итераторы.
Если не уверен, существует ли элемент с индексом N, то используй функцию at вместо оператор [], она проверяет на наличие существование элемента и генерирует исключение, если элемент с данным индексом не найден.
В цикле этого делать не стоит, так-как это лишний overhead.
Цитата(murzilka6002 @  14.11.2011,  13:55 Найти цитируемый пост)
и ещё, как можно сделать потом "навигацию" по классам, то есть:

не понял о чем речь
PM   Вверх
murzilka6002
Дата 14.11.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



Цитата(azesmcar @  14.11.2011,  14:05 Найти цитируемый пост)
Цитата(murzilka6002 @  14.11.2011,  13:55 )
и ещё, как можно сделать потом "навигацию" по классам, то есть:

не понял о чем речь 


Ну я в сумме (когда совсем разберусь, а разбираюсь очень медленно, мозги уже не один день плавятся, информации куча винтернет, но она всё о бинарных деревьях, и ещё так написано что я ещё больше захожу в тупик), хочу построить дерево м-арное, и потом в нём искать данные.

Сначала я хочу написать програму что бы его вручную "строить", думаю тогда разберусь и проще будет с поиском.
Так вот, для этого мне нужно, что бы вводя данные я мог сначала как бы "конструировать" объекты класса.

например: есть у меня класс
Код

class tree_node


Дальше мне нужно через ввод вводить данные объектов, что-то типа:
Код

string a;
cin>>a; //ввожу t_001
tree_node * a;


в результате хочу что бы получилось аналогично
Код

tree_node t_001


можно так реализовать?
PM MAIL   Вверх
azesmcar
Дата 14.11.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(murzilka6002 @  14.11.2011,  14:20 Найти цитируемый пост)
можно так реализовать? 

Нет, а зачем это вообще нужно?
PM   Вверх
bsa
Дата 14.11.2011, 15:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(murzilka6002 @  14.11.2011,  14:12 Найти цитируемый пост)
vector <string> children;

Думаю, тебе необходимо писать так:
Код
template<typename T>
class TreeNode
{
public:
    ~TreeNode() { clear(); }
    void clear() {
        std::for_each(children_.begin(), children_.end(), ChildDeleter());
        children_.clear();
    }
private:
    struct ChildDeleter {
        void operator()(TreeNode<T>*ch) const { delete ch; }
    };
    T value;
    std::vector<TreeNode<T>*> children_;
    //TreeNode *parent_;
};


Это сообщение отредактировал(а) bsa - 14.11.2011, 15:17
PM   Вверх
murzilka6002
Дата 14.11.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



Есть некое дерево (не бинарное) с корнем 
Код

tree_node root;
root.data="root_korzen"; // здесь какие-то находятся данные
root.children.push_back("t_02"); // здесь инфо о потомках узла
root.children.push_back("t_03");
root.children.push_back("t_04");

Далее, так же расписано все дерево.

Задача - мне нужно сделать поиск данных по дереву (поставил преподаватель такую задачу), для этого функция будет проверять начиная с кореня есть ли в root.data" искомые данные, если нет
Код

if (root.data=="данные")
...
else


 тогда начинается поиск таким же способом по потомках данные о которых находяться в "children",  а как его организовать, как сделать посыл на объект класса так же не работает 
Код

root.children.at(0).data=="данные"
 
 smile 

PM MAIL   Вверх
bsa
Дата 14.11.2011, 15:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
class tree_node
{
//...
    const tree_node* find(const string &value) const {
        if (data == value)
          return this;
        for(vector<tree_node*>::const_iterator i = children_.begin(), e = children_.end(); i != e; ++i) {
           const tree_node *node = (*i)->find(value);
           if (node)
              return node;
        }
        return 0;
    }


Это сообщение отредактировал(а) bsa - 14.11.2011, 15:38
PM   Вверх
murzilka6002
Дата 14.11.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



Цитата(bsa @  14.11.2011,  15:16 Найти цитируемый пост)
Думаю, тебе необходимо писать так:


извини за необразованность, но как тогда будет выглядеть узел дерева?
Код

tree_node root;
root.data="root_korzen"; 
root.children.push_back("t_02");
root.children.push_back("t_03");
root.children.push_back("t_04");

PM MAIL   Вверх
bsa
Дата 14.11.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



murzilka6002, у дерева есть листья и ветки. К последним цепляются другие ветки и листья. Соответственно, tree_node - это и есть типичный узел дерева. Если у этого узла нет ни одного чилда, то это лист, иначе - ветка.

Это сообщение отредактировал(а) bsa - 14.11.2011, 15:40
PM   Вверх
murzilka6002
Дата 23.11.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



В общем я попереписывал, упростил....и вот что получилось, но не работает так как нужно, не знаю где я ошибся. Должно выводить все повторяющие слова поиска, ну и должно искать, а поиск дальше первого узла  не идет :(

Код

#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

//Class drzewa
class tree_node
       {
       public:
        int id;                                        //Numer
        string data;                                   //zawartosc
        vector <tree_node> children;                   //dzieci
        };

//Funkcja wyszukiwania
void szukaj(tree_node& t, string& s)
{
         if (t.data==s)                                //Wyszuk
            {
             cout<< t.data<<"\t";                      //Wywod wyszukiwania
             cout<<"id= "<< t.id<<endl;
            }           
         for(int i=0; i<t.children.size();i++)         //Sprawdzanie wezla
                {
                 szukaj(t.children[i],s);
                }
}

        
int main(int argc, char *argv[])
{
    
tree_node root;
root.id=1;
root.data="Ivan";

tree_node node2;
node2.id=2;
node2.data="text";
root.children.push_back(node2);

tree_node node3;
node3.id=3;
node3.data="Andrzej";
root.children.push_back(node3);

tree_node node4;
node4.id=4;
node4.data="Swieta";
root.children.push_back(node4);

tree_node node5;
node5.id=5;
node5.data="Kolia";
root.children.push_back(node5);

tree_node node6;
node6.id=6;
node6.data="Mihal";
node2.children.push_back(node6);

tree_node node7;
node7.id=7;
node7.data="Ivan";
node2.children.push_back(node7);

tree_node node8;
node8.id=8;
node8.data="Tania";
node4.children.push_back(node8);

tree_node node9;
node9.id=9;
node9.data="Andrzej";
node4.children.push_back(node9);

tree_node node10;
node10.id=10;
node10.data="Olia";
node5.children.push_back(node10);

tree_node node11;
node11.id=11;
node11.data="Sasza";
node5.children.push_back(node5);

tree_node node12;
node12.id=12;
node12.data="Tania";
node5.children.push_back(node12);

tree_node node13;
node13.id=13;
node13.data="Kolia";
node7.children.push_back(node13);

tree_node node14;
node14.id=14;
node14.data="Tania";
node10.children.push_back(node14);

tree_node node15;
node15.id=15;
node15.data="Swieta";
node10.children.push_back(node15);

tree_node node16;
node16.id=16;
node16.data="Dawid";
node12.children.push_back(node16);

tree_node node17;
node17.id=17;
node17.data="Wiktor";
node12.children.push_back(node17);

tree_node node18;
node18.id=18;
node18.data="Ania";
node12.children.push_back(node18);


////////////////Wyszukiwanie//////////////////////////

string szuk;

cin>>szuk;
szukaj(root,szuk);

    system("PAUSE");
    return EXIT_SUCCESS;
}



Это сообщение отредактировал(а) murzilka6002 - 23.11.2011, 13:43
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.