Модераторы: 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   Вверх
zim22
Дата 23.3.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Helmet @  23.3.2009,  12:32 Найти цитируемый пост)
А вообще компилятор должен ругать и отказываться компилировать

Поругать может, но отказываться компилировать - нет. Вдруг мне нужна именно такая логика?


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


Новичок



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

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



zim22, опять же цитата из Мейерса: "Контейнеры auto_ptr (COAP, Containers of auto_ptr) запрещены, а программа, которая попытается их использовать, не будет компилироваться. Комитет по стандартизации С++ приложил неслыханные усилия в этом направлении."

Добавлено через 5 минут и 46 секунд
Код

std::auto_ptr < int > ptr(new int(5));
std::vector < std::auto_ptr < int > > v;
v.push_back(ptr);

9 студия не компилирует. Говорит нет конструктора копирования.
PM   Вверх
zim22
Дата 23.3.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Helmet @  23.3.2009,  12:54 Найти цитируемый пост)
9 студия не компилирует

действительно. вот облом smile



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


Эксперт
****


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

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



Так так можно делать?
Код

m_vecpSL.push_back(new TStringList());



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


трололомен
****


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

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



Цитата(Alca @  23.3.2009,  14:50 Найти цитируемый пост)

Так так можно делать?


Ответь - ЗАЧЕМ?
Где это нужно?
Какой злой гений попросил тебя это вытворять с VCL? 

То что ты делаешь - это масло маслянное. Более того вообще не рекомендуются смешивать VCL и STL. 
Ты спросишь почему - а я тебе отошлю к  Холингверту, Баттерфилду и их пацанам.

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


Эксперт
****


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

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



Цитата

mrbrooks
То что ты делаешь - это масло маслянное. Более того вообще не рекомендуются смешивать VCL и STL. 
Ты спросишь почему - а я тебе отошлю к  Холингверту, Баттерфилду и их пацанам.


Ну мне кажется это слишком категорично. Неужели vector<TDateTime> тоже не надо использовать? Некоторые простые классы почему нельзя в вектор запихивать?

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


Эксперт
***


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

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



Тут заметил одну интересную фишку...
А что, BrainBench совсем испортился, что за такие вещи (std::vector< const std::auto_ptr<TStringList> >) теперь уже звание Master C++ дают?  smile 
PM MAIL   Вверх
mrbrooks
Дата 23.3.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(Anikmar @  23.3.2009,  15:12 Найти цитируемый пост)
Ну мне кажется это слишком категорично.

Пусть это будет на совести авторов. Они были убедительны.  smile 
Цитата(Anikmar @  23.3.2009,  15:12 Найти цитируемый пост)
Неужели vector<TDateTime> тоже не надо использовать? Некоторые простые классы почему нельзя в вектор запихивать?

А зачем? У VCL полно своего инструментария. Я лично никогда не мешаю бормановские классы со стандартными. Как то спокойнее. Да и необходимости в этом не вижу.
PM MAIL   Вверх
Anikmar
Дата 23.3.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

mrbrooks
А зачем? У VCL полно своего инструментария. Я лично никогда не мешаю бормановские классы со стандартными. Как то спокойнее. Да и необходимости в этом не вижу. 


У меня так как правило само собой получается, но этот конкретный пример я привел из своей практики - ну понадобился мне массив дат. Причем размер изначально непонятный, в процессе работы меняется. Что вы мне порекомендуете из стандартных средств VCL? Может я просто чего-то не знаю. TList? Неудобно - чистить надо.

Второй момент - собственные классы, в состав которых входит та же дата либо еще какой-нибудь объект VCL. Тоже иногда вектор вполне подходит. Просто если такие ограничения действительно аргументированы - то надо к ним прислушаться. А если из разряда "неаккуратненько как-то" - то это чисто на вкус и на цвет.


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


Explorer
****


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

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



mrbrooks, у всех свои тараканы, я вот например не стану юзать QT'шные поделки, которые есть в STL, хотя и использую QT. В этом нет ничего плохого 


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


Эксперт
****


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

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



а нельзя просто вычислить индекс в StringList, например тебе нужна структура данных их 3х стринг листов, каждый из которых содержит 10 строк, тогда просто создаешь 1 StringList на 30 строк, 0-9-й элементы, это условно 1-й stringlist, 10-19й - 2-й, с 20-29й - 3-й StringList
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 23.3.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



vinter, за QT ничего не скажу. Не стал бы я в этом плане сравнивать VCL и QT  smile 

Цитата(Anikmar @  23.3.2009,  15:37 Найти цитируемый пост)
Что вы мне порекомендуете из стандартных средств VCL? Может я просто чего-то не знаю. TList? Неудобно - чистить надо.

Его родимого. Можно TBaseArray, TValueArray. Насчет чистки - ну а кто сказал что будет легко.  smile 

Цитата(Anikmar @  23.3.2009,  15:37 Найти цитируемый пост)
Просто если такие ограничения действительно аргументированы - то надо к ним прислушаться. 

Авторы были убедительны. Правда речь шла о шестом Бормане - но сомневаюсь я что  что - то изменилось. 
PM MAIL   Вверх
Anikmar
Дата 23.3.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

mrbrooks
Насчет чистки - ну а кто сказал что будет легко.   


Вот и я про то же. Зачем изобретать велосипед? Если приложение однозначно должно работать без VCL, то все понятно. Но почему объекты VCL нельзя запихивать в vector - для меня загадка. Vector - обычный шаблон и в нем вроде как нет ничего особенно такого, чтобы нельзя было применить конструкцию vector<TDateTime>.

Проведу аналогию (господи, только бы к баяну не привел мой пример), использовать конструкцию while(true){..... только чтобы вместо goto использовать break. Лично я не вижу здесь никакой красоты и понятности, наоборот - дополнительный отступ, лишние переносы, следить лишний раз за скобками.

Поэтому интересно было бы услышать действительно весомый аргумент: Не рекомендуется использовать vector<TDateTime> потому, что это может привести к таким-то отрицательным моментам:.......


PM MAIL ICQ   Вверх
vinter
Дата 23.3.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Anikmar @  23.3.2009,  17:08 Найти цитируемый пост)
Проведу аналогию (господи, только бы к баяну не привел мой пример), использовать конструкцию while(true){..... только чтобы вместо goto использовать break. Лично я не вижу здесь никакой красоты и понятности, наоборот - дополнительный отступ, лишние переносы, следить лишний раз за скобками.

еретик   smile 


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


Эксперт
****


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

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



Цитата

vinter
еретик     


Я так и знал  smile  smile 
PM MAIL ICQ   Вверх
mrbrooks
Дата 23.3.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(Anikmar @  23.3.2009,  16:08 Найти цитируемый пост)
Не рекомендуется использовать vector<TDateTime> потому, что это может привести к таким-то отрицательным моментам:.......

Сейчас пролистываю мануал в поисках - в чем же загвоздка совместного использования - найти не нашел - но строгие указатели применяются авторами к объектам VCL на лево и на право.  smile

Добавлено через 57 секунд
Цитата(vinter @  23.3.2009,  16:12 Найти цитируемый пост)
еретик   smile  

 smile 
PM MAIL   Вверх
mes
Дата 23.3.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  15:08 Найти цитируемый пост)

Проведу аналогию (господи, только бы к баяну не привел мой пример), использовать конструкцию while(true){..... только чтобы вместо goto использовать break. 

Поверь, это не из за "боязни" использoвать goto.



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


Эксперт
****


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

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



Цитата

mrbrooks
Сейчас пролистываю мануал в поисках - в чем же загвоздка совместного использования - найти не нашел - но строгие указатели применяются авторами к объектам VCL на лево и на право.  


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

Достаточно много примеров неумелого использования шаблонов, а потом авторы кричат - полная лажа этот STL. А на самом деле просто неправильно пользуются. Лично видел один код, когда автор потратил уйму времени на создание конструкторов копирования, операторов присваивания для класса,  котором было больше полусотни полей, причем часть из них стркутуры. Когда он все это запихал в вектор, да еще размером больше 100 тысяч элементов и получил ужасающие тормоза, он начал кричать, что STL писали полные ламеры и никакой оптимизации алгоритмов там нет. Он очень удивился, когда узнал, что через указатели все это делается гораздо проще и летает круче самолета.

Добавлено через 3 минуты и 31 секунду
 smile 
Цитата

mes
Поверь, это не из за "боязни" использoвать goto.


 smile 
goto здесь не обсуждаем! Это был пример! 
Никто goto не должен боятся - он мирный и не кусается!
 smile 

Обсуждаем опасность конструкции vector<TDateTime>

Почему я должен использовать TList в данном случае. И что будет плохого, если все-таки использую vector. Вопрос не праздный - я действительно использовал vector<TDateTime> и если это опасно - я срочно переделаю код, пока помню где это.

Хочу знать: почему опасно?



PM MAIL ICQ   Вверх
mrbrooks
Дата 23.3.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(Anikmar @  23.3.2009,  16:28 Найти цитируемый пост)
Думаю все дело в конкретных случаях. Ведь молотком надо гвозди забивать, но с дури можно и шурупы. 

Про нечто подобное и писали авторы. 

Цитата(Anikmar @  23.3.2009,  16:28 Найти цитируемый пост)
Достаточно много примеров неумелого использования шаблонов, а потом авторы кричат - полная лажа этот STL. А на самом деле просто неправильно пользуются.

Я честно говоря таких не встречал. Наоборот в STL сила С++ имхо.

Добавлено через 1 минуту и 9 секунд
По памяти вспомнить не могу - давно читал - но помню два слова относительно VCL - осторожно и Дельфи.
PM MAIL   Вверх
mes
Дата 23.3.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  15:28 Найти цитируемый пост)

Обсуждаем опасность конструкции vector<TDateTime>

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


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


Эксперт
****


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

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



Цитата

mrbrooks
По памяти вспомнить не могу - давно читал - но помню два слова относительно VCL - осторожно и Дельфи. 


Если вспомните, скажите пожалуйста. Очень интересно, если честно.

PM MAIL ICQ   Вверх
mes
Дата 23.3.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  15:28 Найти цитируемый пост)
Почему я должен использовать TList в данном случае. И что будет плохого, если все-таки использую vector. Вопрос не праздный - я действительно использовал vector<TDateTime> и если это опасно - я срочно переделаю код, пока помню где это.

Хочу знать: почему опасно?

Предполагаю из за бинарной совместимости, std::vector не рекомендуется передавать между приложением и библиотекой. 
насчет VCL не знаю есть ли, но по идеи они должны гарантировать совместимость для "своих" типов. 

Это сообщение отредактировал(а) mes - 23.3.2009, 16:41


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


Эксперт
****


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

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



Цитата

mes
Предполагаю из за бинарной совместимости, std::vector не рекомендуется передавать между приложением и библиотекой. 
насчет VCL не знаю есть ли, но по идеи они должны гарантировать совместимость для "своих" типов. 


Что значит бинарная совместимость? Ведь объект vector создается налету - как же он бинарно может быть не совместим? Копипастим vector и делаем его нешаблонным, что изменится?
PM MAIL ICQ   Вверх
mes
Дата 23.3.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  15:47 Найти цитируемый пост)
Что значит бинарная совместимость? Ведь объект vector создается налету - как же он бинарно может быть не совместим? Копипастим vector и делаем его нешаблонным, что изменится? 

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

В пределах одного приложения проблем по вышеообозначеному предмету соответсвенно нет.

Это сообщение отредактировал(а) mes - 23.3.2009, 16:55


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


Эксперт
****


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

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



Цитата

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


Ну так можно сказать про любой класс. Почему это только на вектор распространяется? Ведь любой класс, откомпилированный разными компиляторами (да даже и одним и тем же с разными настроуками выравнивания) может оказаться бинарно несовместимым.

PM MAIL ICQ   Вверх
mes
Дата 23.3.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  15:58 Найти цитируемый пост)
Ну так можно сказать про любой класс. Почему это только на вектор распространяется? Ведь любой класс, откомпилированный разными компиляторами (да даже и одним и тем же с разными настроуками выравнивания) может оказаться бинарно несовместимым.

вектор был для примера, речь идет о библиотеках в целом : std и VCL
первый абзац :
http://qt.osdn.org.ua/binarycompat.html


Это сообщение отредактировал(а) mes - 23.3.2009, 17:10


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


Эксперт
****


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

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



Цитата

Цитата(Alca @  23.3.2009,  14:50 )

Так так можно делать?



Ответь - ЗАЧЕМ?
Где это нужно?
Какой злой гений попросил тебя это вытворять с VCL? 

То что ты делаешь - это масло маслянное. Более того вообще не рекомендуются смешивать VCL и STL. 
Ты спросишь почему - а я тебе отошлю к  Холингверту, Баттерфилду и их пацанам.

Как можно в VCL работать с динамическими массива любого типа?

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


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


Эксперт
***


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

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



Цитата(Anikmar @  23.3.2009,  16:28 Найти цитируемый пост)
Почему я должен использовать TList в данном случае. И что будет плохого, если все-таки использую vector. Вопрос не праздный - я действительно использовал vector<TDateTime> и если это опасно - я срочно переделаю код, пока помню где это.

Хочу знать: почему опасно?

успокойся, это НЕОПАСНО. Можно использовать VCL и STL вместе. И с boost можно. Никаких противопоказаний нет. Требования к VCL классам такиеже как и к обычным классам при использовании с STL.
Другое дело, что в лит-ре встречаются рекомендации наподобии:
"если Вы используете какую-то библиотеку, то пользуйтесь ею по-максимуму" 
т.е. если вы пользуетесь VCL, то используйте ее динамический массив (совсем необязательно TList, который нешаблонный и хранит указатели и нужно кастить). В VCL есть вроде как шаблонные классы что-то типа DynamicArray<> и они вполне адекватная альтернатива STL.

Логика тут такая : если можно обойтись одной библиотекой, то зачем использовать две... 

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


любитель
****


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

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



Цитата(Alca @  23.3.2009,  16:30 Найти цитируемый пост)
Как можно в VCL работать с динамическими массива любого типа?

Имхо, этот в вопрос лучше задать в ветке по борланду. 
интуитивно предполагаю, что это должен быть TArray<>

Это сообщение отредактировал(а) mes - 23.3.2009, 17:54


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


Эксперт
****


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

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



ИМХО
STL входит в стандарт языка (думаю boost тоже войдет). 
Касаемо других библиотек - согласен. Но STL - это уж вроде как незыблемо.

А вот аналога vector я в VCL не знаю, если честно.

А в MFC (CLR) есть? 

PM MAIL ICQ   Вверх
vinter
Дата 23.3.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Fazil6 @  23.3.2009,  18:48 Найти цитируемый пост)
"если Вы используете какую-то библиотеку, то пользуйтесь ею по-максимуму" 

глупый совет


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


Эксперт
****


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

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



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

Может из-за этого путаница? В библиотеке STL при использовании vector не используются никакие бинарные объекты - все рождается на этапе компиляции. На то это и шаблоны. Может в boost есть отдельные функции, которые находятся в библиотеке в двоичном виде, но само название STL говорит, что это не более чем набор заголовочных файлов с шаблонами.
PM MAIL ICQ   Вверх
Alca
Дата 23.3.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я чета не понял.  smile  Кто-нибудь читал тему топика? 


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


Explorer
****


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

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



Цитата(Alca @  23.3.2009,  19:29 Найти цитируемый пост)
Я чета не понял.    Кто-нибудь читал тему топика? 

а зачем?  smile 


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


Эксперт
***


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

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



Цитата(Anikmar @  23.3.2009,  18:25 Найти цитируемый пост)
Вообще-то билиотека в обычном понимании - библиотека объектных модулей и библиотека стандартных шаблонов это принципиально разные вещи.

Может из-за этого путаница? В библиотеке STL при использовании vector не используются никакие бинарные объекты - все рождается на этапе компиляции. На то это и шаблоны. Может в boost есть отдельные функции, которые находятся в библиотеке в двоичном виде, но само название STL говорит, что это не более чем набор заголовочных файлов с шаблонами. 


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

Цитата(Alca @  23.3.2009,  18:29 Найти цитируемый пост)
Я чета не понял.  smile  Кто-нибудь читал тему топика?  

а чего его читать? По существу вопроса достаточно первых 5-6 сообщений. 
Дальше народ использует возможность блестнуть эрудицией. Так что не мешай... 
PM MAIL   Вверх
Anikmar
Дата 23.3.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fazil6 @  23.3.2009,  18:42 Найти цитируемый пост)
Помоему ты слишком близко к сердцу все это принимаешь...

 smile  Если это так выглядит то нет, просто интересно.

Если есть вещь, которую я использую, но оказывается не все про нее знаю - интересно выяснить.

А вообще-то на пустом месте баян получился  smile 
PM MAIL ICQ   Вверх
mes
Дата 23.3.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  23.3.2009,  17:55 Найти цитируемый пост)

А вообще-то на пустом месте баян получился  smile  

на то и пустое место -  было бы что интересного по теме, текло бы нормальное обсуждение smile


--------------------
PM MAIL WWW   Вверх
Alca
Дата 23.3.2009, 19:09 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



 smile 


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


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

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