Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2014, 19:59   #11
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Что-ж буду использовать низкоуровневый массив для хранения потомков. Всем огромное спасибо!
KemanSR вне форума Ответить с цитированием
Старый 10.09.2014, 20:12   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
Что-ж буду использовать низкоуровневый массив для хранения потомков. Всем огромное спасибо!
Плохая идея.

Хорошая идея: использовать вектор.

1. Вектор умных указателей на элементы.
Потребители смогут безопасно работать с элементами посредством
указателя.

2. Вектор сырых указателей на элементы.
Не так безопасно, как пункт 1, но иногда дополнительная
безопасность и не требуется.

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

-------------------------------

Так же можно использовать "стабильный вектор" - контейнер из библиотеки boost, который способен гарантировать неизменность адреса элемента.

Стабильный вектор менее эффективен, чем стандартный, если нужно работать с указателями.
Но более эффективен, если в контейнере нужно хранить по значению.

http://www.classes.cs.uchicago.edu/a...reference.html
_Bers вне форума Ответить с цитированием
Старый 10.09.2014, 20:49   #13
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Ну я не такой быстрый, поэтому начну с п. 1. Не понимаю слово "умных", поясните если не трудно, желательно на моем примере. Спасибо.
KemanSR вне форума Ответить с цитированием
Старый 10.09.2014, 21:45   #14
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Да может.
Нельзя закладываться на неизменность адрес объекта элемента вектора.

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

Поэтому, старый адрес элемента может стать невалидным.
Кто бы спорил, только не я.
Функция - capacity.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.09.2014, 21:46   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
Ну я не такой быстрый, поэтому начну с п. 1. Не понимаю слово "умных", поясните если не трудно
http://habrahabr.ru/post/140222/


Цитата:
Сообщение от KemanSR Посмотреть сообщение
желательно на моем примере. Спасибо.
Предоставьте минимальный компилирующийся код, который иллюстрирует вашу проблему.
Тогда я сделаю реализацию на умных указателях.

А допиливать ваш код - увольте.

Могу лишь показать пример-иллюстрацию работы с умными указателями:
http://rextester.com/OUGAT91897

Код:
#include <iostream>
#include <vector>
#include <memory>

using namespace std;

//элемент контейнера
struct Element{};


//для сокращения писанины 
typedef shared_ptr<Element> Smart;

int main()
{
    cout << "Hello, world!\n";
    
    //контейнеры хранят в себе объекты не по значению
    //а умные указатели на эти объекты
    vector<Smart> myvec1;
    vector<Smart> myvec2;
    
    //когда объекты нам станут не нужны
    //умные указатели сами вызовут объектам delete 
    

    
    //создаем объекты и заполняем контейнеры
    for(size_t n=0;n<3;++n)
    {
        //создаем объект типа Element, помещенный в умный указатель.
        const auto obj = make_shared<Element>();
        
        
        //помещаем умный указатель в контейнер. 
        //Теперь, даже если контейнер и реалокнется,
        //адрес самого объекта не изменится.
        myvec1.push_back( obj );
        
        //расшариваем объект между двумя умными указателями.
        //теперь два умных указателя смотрят на один и тот же объект
        myvec2.push_back( myvec1.back() );
        
        //показываем адрес созданного объекта
        cout << "addres origin object: "<< myvec1.back()
             << " --- address from second container: " 
             << myvec2.back() 
             << endl;
        
        //мы видим - в обоих контейнерах умные 
        //указатели хранят один и тот же объект
        
        //умные указатели хранят внутри себя ссылку на настоящий объект
        //и счетчик ссылок - сколько умных указателей владеют объектом
        //когда умный указатель дохнет - счетчик уменьшается
        //когда счетчик дойдет до нуля - объект будет автоматически удален
    }
    
}
_Bers вне форума Ответить с цитированием
Старый 10.09.2014, 21:49   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Кто бы спорил, только не я.
Функция - capacity.
1. capacity делает не то, о чем вы подумали.

2. Если вам заранее точно известно количество элементов, вам не нужен std::vector.

Вам нужен std::array.

3. Если вам заранее не известно количество элементов, то reserve вас не спасет, и не даст вам никаких гарантий.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На основе контейнера vector построить двумерный динамический массив С++ Вероника99 Помощь студентам 1 25.05.2014 17:22
C++ Boost - vector<path> to vector<string> frommars Общие вопросы C/C++ 0 04.02.2013 21:19
Как вытащить строку из vector'a Tema_Crazzzy Общие вопросы C/C++ 2 12.09.2010 20:38
проблема с push_back torres Общие вопросы C/C++ 6 20.08.2010 15:27
Как программно удалить компонент от формы или другого компонента (контейнера)? SkAndrew Общие вопросы Delphi 3 27.05.2008 15:20