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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> деревья с неизвестным количеством потомков. 
:(
    Опции темы
tonchitos
Дата 13.3.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Mayk, то есть вы за тот пример который мне на работе предложили?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Mayk
Дата 13.3.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(tonchitos @  13.3.2008,  14:12 Найти цитируемый пост)
Mayk, то есть вы за тот пример который мне на работе предложили? 

Да, мы за него. Он значительно лучше наследования. И он не зависит от вектора в том смысле, что когда ты работаешь с деревом, ты всегда можешь 
использовать GetChild(), а не соображать "а реализован ли operator[] у вектора или позавчера мы заменили vector на list и поэтому наш tree[4] сегодня валится с дымом и едким запахом"

Это сообщение отредактировал(а) Mayk - 13.3.2008, 10:39


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 13.3.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



на тот случай, если под аргументами против вектора понимаются мои слова, то поясню конкретнее:
дело не в том, вектор или список или ещё что-то
дело в том, что хранится в контейнере
если что-то запихиваешь в вектор, нужно быть готовым к копированию этого объекта
и если дерево будет большим, это может привести к неожиданным и непонятным оверхедам

так что при условии использования вектора я бы посоветовал хранить в нём указатели (обычные или умные - другой вопрос), чтобы избежать ненужного копирования больших объёмов данных

Это сообщение отредактировал(а) maxim1000 - 13.3.2008, 12:58


--------------------
qqq
PM WWW   Вверх
tonchitos
Дата 13.3.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



перегружаю оператор =.
почему то ошибка.

не пойму где:

Код

namespace GUI
{
    class Node 
    {
        std::vector<Node> childs;
        std::string Name;
    
    public:
    .......
        .......
    
        void operator = (const Node & from);

    
    };

}


Код


void GUI::Node::operator =(const GUI::Node &from)
{
    GUI::Node::childs = from;
}


Это сообщение отредактировал(а) tonchitos - 13.3.2008, 14:01


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Lazin
Дата 13.3.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



оператор присваивания обычно выглядит так:
Код

Node& operator = (const Node & from);

и вот здесь:
Код

GUI::Node::childs = from;

нужно написать вот так
Код

if (&from == this) return *this;
childs = from.childs;
Name = from.Name;
return *this;

PM MAIL Skype GTalk   Вверх
Mayk
Дата 13.3.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Lazin @  13.3.2008,  18:14 Найти цитируемый пост)
if (&from == this) return *this;
childs = from.childs;
Name = from.Name;
return *this;

если не заменить vector<Node> на vector<Node*> как сказал maxim1000, то делать оператор присваивания большого смысла нет --- компилятор и сам напишет.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
tonchitos
Дата 13.3.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void CADlg::OnButton4()
{
// TODO: Add your control notification handler code here CFile theFile;
theFile.Open("tree.sav",CFile::modeCreate| CFile::modeWrite);
CArchive ar(&theFile,CArchive::store);

HTREEITEM hti = m_tree.GetRootItem();
while(hti)
{
int indent = GetIndentLevel(hti);
while(indent--)
ar.WriteString("\t");
ar.WriteString(m_tree.GetItemText(hti)+"\r\n");
hti= GetNextItem(hti);
}

ar.Close();
theFile.Close();
} 


вот пример, но он сохраняет банально текст.

Это сообщение отредактировал(а) tonchitos - 13.3.2008, 16:49


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 13.3.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ответьте уже кто нить!

плиз  smile 


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
korian
Дата 13.3.2008, 17:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Прочитав лекцию Mayk, хочу согласиться с тем, что включение контейнера в класс намного лучше наследования.
В свое оправдание могу лишь сказать, что на тот момент, я не рассматривал такой вариант. (вариант предложен не был, а мой моск до этого чета не дошел  smile  ).
В варианте с наследованием, все проблемы можна решить, но по сравнению с вариантом композиции, это действительно будет "героическое преодоление собственных граблей".
По поводу жесткой привязки, я имел ввиду то, что данная реализация, а именно доступ к элементу по индексу, привязывает к вектору. Если уходить от вектора к листу из-за перевыделения памяти, то получаем увеличенное время для доступа к элементу.

Цитата(tonchitos @  13.3.2008,  16:04 Найти цитируемый пост)
ответьте уже кто нить!

в каком виде его сохранить то надо?
PM   Вверх
tonchitos
Дата 13.3.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне тут один человек предложил следующий вариант:
Код



namespace GUI
{
     template <typename T>
     class Node 
     {
          std::vector<Node> childs;
          Node* parent;
          static int level = 0;
     public:
          T data;
          void printToFile( File file )
          {  file.write( *new container<T>( data );
             Node::level++;
             for (по всем childs) childs[i].printToFile( file );
             Node::level--;
          }
...............
...............
.............
};

    template <typename T>
    class container
    {
       public: container( T d ) : data( d ), level( Node::level ) {}
         int level; // уровень в дереве
         T data;
    };
}



--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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