Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Vector::reserve()


Автор: GKosh 24.6.2006, 09:02
Раньше как-то не приходилось использовать этот stl-класс.
Постоянно выдавает ошибки если перед добавлением элементов размер вектора не задавался явно  - reserve(количество_чтобы_наверняка). Глупость какая-то, ведь по идее он должен делать это сам с каким-то предустановленным шагом.

И сразу вопрос в догонку - если я создаю в VS.NET чистый Win32 проект без .NET'а возможно использовать в нем вектор? И если да, то будет ли он отличаться в ипользовании? (спрашиваю, поскольку на старой схеме но в новом проекте появился новый баг)

Заранее спасибо, Константин.  

Автор: Daevaorn 24.6.2006, 09:41
Цитата(GKosh @  24.6.2006,  10:02 Найти цитируемый пост)
Постоянно выдавает ошибки если перед добавлением элементов размер вектора не задавался явно  - reserve(количество_чтобы_наверняка). 

reserve - на самом деле не увеличивает размер вектора. Он лишь говорит вектору, чтобы тот зрезервировал нужное количество пямяти под добавленные в последствии объекты.( v.reserve( N ) -> v.capacity() >= N -> v.size() != N )
resize - вот этот метод реально увеличивает размер вектора( v.resize( N ) -> v.size() == N )
Цитата(GKosh @  24.6.2006,  10:02 Найти цитируемый пост)
Глупость какая-то, ведь по идее он должен делать это сам с каким-то предустановленным шагом.

При использовании push_back(), insert() и т.д. - размер вектора сам увеличивается
Цитата(GKosh @  24.6.2006,  10:02 Найти цитируемый пост)
если я создаю в VS.NET чистый Win32 проект без .NET'а возможно использовать в нем вектор?

Стандартная библиотека не зависит от платформы. Вектор был и под ДОС. Конечно при условии, что компилятор под данную платформу.
Цитата(GKosh @  24.6.2006,  10:02 Найти цитируемый пост)
И если да, то будет ли он отличаться в ипользовании?

Следовательно нет. Разницы нет. 

Автор: Fazil6 24.6.2006, 09:47
Цитата

Постоянно выдавает ошибки если перед добавлением элементов размер вектора не задавался явно

как добавляешь? если используя оператор [] то естественно будет ошибка. 

Автор: DeadSoul 24.6.2006, 10:31
Цитата(GKosh @  24.6.2006,  09:02 Найти цитируемый пост)
И сразу вопрос в догонку - если я создаю в VS.NET чистый Win32 проект без .NET'а возможно использовать в нем вектор? И если да, то будет ли он отличаться в ипользовании? (спрашиваю, поскольку на старой схеме но в новом проекте появился новый баг)

Ничем. Основный проблемы моут быть при использование stl при статической линковке рантайма.

Цитата(GKosh @  24.6.2006,  09:02 Найти цитируемый пост)
Постоянно выдавает ошибки если перед добавлением элементов размер вектора не задавался явно  - reserve(количество_чтобы_наверняка). Глупость какая-то, ведь по идее он должен делать это сам с каким-то предустановленным шагом.

Если использовать push_back, то будутпроисходить перераспределения памяти. Пример:
Код

    std::vector<int> vec;
//    vec.reserve(100000 ); Запусти с этой строчкой закомментированной и раскомментированной
    for ( int i=0 ; i<100000 ; ++i )
    {
        if ( vec.size() == vec.capacity() )
            std::cout<<"Relocating memory"<<std::endl;
        vec.push_back(i);
    }

    std::cout<<"Done"<<std::endl;



Добавлено @ 10:33 
Цитата(Fazil6 @  24.6.2006,  09:47 Найти цитируемый пост)
Цитата
Постоянно выдавает ошибки если перед добавлением элементов размер вектора не задавался явно
как добавляешь? если используя оператор [] то естественно будет ошибка.  

Добавлю. Попробуй "добавлять" используя метод at. Ошибку получишь гарантировано. Использование operator[] просто скрывает ошибку, а отладочная версия stl появилась только в 8-ке

Добавлено @ 10:34 
И еще скачай книгу Джосьютиса. Там все разжевано(и книга просто потрясающая) 

Автор: MAKCim 24.6.2006, 14:31
Цитата

И сразу вопрос в догонку - если я создаю в VS.NET чистый Win32 проект без .NET'а возможно использовать в нем вектор? И если да, то будет ли он отличаться в ипользовании?

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

Автор: Earnest 24.6.2006, 18:31
 smile 
Цитата(MAKCim @  24.6.2006,  15:31 Найти цитируемый пост)
она задает некоторые интерфейсы (не в прямом значении этого слова), 

Как раз в прямом. Слово "интерфейс" использовалось в программировании еще до появления модели COM.

 

Автор: GKosh 26.6.2006, 21:02
Большое всем спасибо! Все понятно - вопрос закрыт. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)