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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы: как правильно заполнить std::vector? 
V
    Опции темы
Alca
Дата 20.3.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Классы: как правильно заполнить std::vector?
Код

//Unit1.h
class TfrmMain: public TForm {
    public:
        std::vector<TStringList *> m_vecpSL;
        //TStringList *m_pSL; //или сюда его втулить?        
};    
    
//Unit1.cpp    
void __fastcall TfrmMain::btnTestClick(TObject *Sender) {
    for (int i = 0; i < 10; i ++) {
        TStringList *m_pSL = new TStringList();    //<<<<<<<<<<<< ??? или здесь оставить?
        m_vecpSL.push_back(m_pSL);
    }
}

По ходу m_pSL выходит из области видимости. Куда его впихнуть?

Это сообщение отредактировал(а) Alca - 20.3.2009, 18:23


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alek86
Дата 20.3.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1) std::vector< const std::auto_ptr<TStringList> >
2) std::vector<boost::shared_ptr<TStringList> >
3) boost::ptr_vector
4) свой класс, подменяющий std::vector, хранящий указатели с выделенной памятью и вызывающий delete для указателей, которые из него удаляются


--------------------
user posted image    user posted image
PM MAIL   Вверх
andrew_121
Дата 20.3.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Alca, А m_pSL тебе и не нужен. Ты же адреса запомнила. Значит и восстановить можешь.

Добавлено через 54 секунды
Цитата(Alek86 @  20.3.2009,  18:45 Найти цитируемый пост)
4) свой класс, подменяющий std::vector, хранящий указатели с выделенной памятью и вызывающий delete для указателей, которые из него удаляются 

Да. Или сама освобождай память.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Rififi
Дата 20.3.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alca, 
при выходе из области видимости исчезает переменная m_pSL, но не выделенный блок данных, на который она указывала. В деструкторе класса TfrmMain не забудь почистить вектор.

std::vector< const std::auto_ptr<TStringList> >
user posted image Здесь была могилка этой программы. :gigi:


Это сообщение отредактировал(а) Rififi - 20.3.2009, 18:51
PM MAIL   Вверх
vinter
Дата 20.3.2009, 19:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Alek86 @  20.3.2009,  19:45 Найти цитируемый пост)
1) std::vector< const std::auto_ptr<TStringList> >

 smile сотри быстро smile


--------------------
Мой блог
PM MAIL WWW   Вверх
Alca
Дата 23.3.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Alca, А m_pSL тебе и не нужен. Ты же адреса запомнила. Значит и восстановить можешь.

Значит можно так?:
Код

//Unit1.h
class TfrmMain: public TForm {
    public:
        std::vector<TStringList *> m_vecpSL;
};    
    
//Unit1.cpp    
void __fastcall TfrmMain::btnTestClick(TObject *Sender) {
    for (int i = 0; i < 10; i ++) {
        m_vecpSL.push_back(new TStringList());
    }
}


Это сообщение отредактировал(а) Alca - 23.3.2009, 12:27


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 23.3.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alca, а в чем прикол тогда вектора? Автоматически чистить не будет - ИМХО auto_ptr мне кажется лучше.
PM MAIL ICQ   Вверх
Lazin
Дата 23.3.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @  20.3.2009,  18:20 Найти цитируемый пост)
как правильно заполнить std::vector?

очень просто
Код

std::vector<int> vect;
std::generate(vect.begin(), vect.end(), &rand);


Добавлено через 2 минуты и 5 секунд
Цитата(Anikmar @  23.3.2009,  12:19 Найти цитируемый пост)
Alca, а в чем прикол тогда вектора? Автоматически чистить не будет - ИМХО auto_ptr мне кажется лучше

еще один камикадзе? smile 
PM MAIL Skype GTalk   Вверх
Helmet
Дата 23.3.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.2.2009
Где: Someone's hea d

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



Anikmar, нельзя auto_ptr'ы в контейнеры класть. Тебе же vinter сказал  smile 
PM   Вверх
Anikmar
Дата 23.3.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Lazin
еще один камикадзе?  


Честно говоря я никогда не использовал auto_ptr - как-то привык сам за собой убирать. Но в данном конкретном случае чем плох такой подход? Почему нельзя?
PM MAIL ICQ   Вверх
vinter
Дата 23.3.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Anikmar @  23.3.2009,  13:26 Найти цитируемый пост)
 Но в данном конкретном случае чем плох такой подход? Почему нельзя?

auto_ptr нарушает семантику присваивания, которе сплошь и рядом в каждом контейнере


--------------------
Мой блог
PM MAIL WWW   Вверх
Alca
Дата 23.3.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

очень просто
Код

std::vector<int> vect;
std::generate(vect.begin(), vect.end(), &rand);


Код

std::vector<TStringList *> vect;
std::generate(vect.begin(), vect.end(), new TStringList());

Так что ли???


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 23.3.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

vinter
auto_ptr нарушает семантику присваивания, которе сплошь и рядом в каждом контейнере 


На примере можно? Что-то я не полнял.
PM MAIL ICQ   Вверх
Helmet
Дата 23.3.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.2.2009
Где: Someone's hea d

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



Цитата(Anikmar @  23.3.2009,  12:26 Найти цитируемый пост)
Почему нельзя? 

Мейерс: "При копировании auto_ptr право владения объектом, на который ссылается указатель, переходит к копии, а исходному указателю присваивается NULL."
А вообще компилятор должен ругать и отказываться компилировать за попытку положить в контейнер auto_ptr.
PM   Вверх
Anikmar
Дата 23.3.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Helmet
Мейерс: "При копировании auto_ptr право владения объектом, на который ссылается указатель, переходит к копии, а исходному указателю присваивается NULL."
А вообще компилятор должен ругать и отказываться компилировать за попытку положить в контейнер auto_ptr. 

Мда, не знал. (Правда думаю узнал бы сразу - как только использовать бы начал, было бы разочарование) - я для себя предполагал, что auto_ptr наиболее удобен как раз для векторов - когда нужно те объекты хранить, которые только через new создаются.

Спасибо, буду знать на будущее.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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