как задать размер вектора в STL
От: Данилович Алексей  
Дата: 23.11.04 08:05
Оценка:
Доброго времени суток.
Вопрос следующий. В.h файле объявлен какой-то класс, членом которого является:
class some {
....
vector<some_type> a;

};

В каком-то месте в реализации мне надо задать реальный размер этого вектора. Пытаюсь сделать это двумя способами:
...
int size=...;
a=vector<some_type>(size); // 1-ый способ
a.assign(size,zerostructure); // 2-ой способ
....

Оба варианта нормально компилируются. И при исполнении вылетает ошибка access violation в коде _algobase.h. Поясните, пожалуйста, что может быть не так, и как еще можно указать размер вектора. Пользуюсь C++Builder 6.

Огомное спасибо.
Re: как задать размер вектора в STL
От: _nn_  
Дата: 23.11.04 08:07
Оценка:
Здравствуйте, Данилович Алексей, Вы писали:

ДА>Доброго времени суток.

ДА>Вопрос следующий. В.h файле объявлен какой-то класс, членом которого является:
ДА>class some {
ДА>....
ДА>vector<some_type> a;

ДА>};


ДА>В каком-то месте в реализации мне надо задать реальный размер этого вектора. Пытаюсь сделать это двумя способами:

ДА>...
ДА>int size=...;
ДА>a=vector<some_type>(size); // 1-ый способ
ДА>a.assign(size,zerostructure); // 2-ой способ
ДА>....

ДА>Оба варианта нормально компилируются. И при исполнении вылетает ошибка access violation в коде _algobase.h. Поясните, пожалуйста, что может быть не так, и как еще можно указать размер вектора. Пользуюсь C++Builder 6.


ДА>Огомное спасибо.


Изменять размер следует через функцию resize.

vector<int> x;

x.resize(10); // 10 элементов
x.resize(100); // 100 элементов
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: как задать размер вектора в STL
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 23.11.04 08:08
Оценка: -1
Здравствуйте, Данилович Алексей, Вы писали:

ДА>В каком-то месте в реализации мне надо задать реальный размер этого вектора. Пытаюсь сделать это двумя способами:


vector::reserve()
[ posted via RSDN@Home 1.1.4 beta 3 r233 ]
- Искренне ваш, Поросенок Пафнутий
Re: как задать размер вектора в STL
От: Bell Россия  
Дата: 23.11.04 08:18
Оценка:
Здравствуйте, Данилович Алексей, Вы писали:

Для изменения размера вектора используется ф-я resize. Так же посмотри еще в сторону reserve.
Твои способы в принципе тоже корректны, но выглядят как-то небычно что ли...
Что касается ошибки — то скорее всего где-то вылез за пределы массива. Попробуй вместо operator[]
использовать at() — эта функция проверяет нидекс на валидность, и в случае чего кидает исключение:

vector<int> v;
v.resize(10);
v.at(10) = 0;//exception
Любите книгу — источник знаний (с) М.Горький
Re[2]: как задать размер вектора в STL
От: MaximE Великобритания  
Дата: 23.11.04 08:34
Оценка:
_nn_ wrote:

> Изменять размер следует через функцию resize.

>
>
> vector<int> x;
>
> x.resize(10); // 10 элементов
> x.resize(100); // 100 элементов
>


Наверное, будет более правильно сказать, что изменять в размер только в большую сторону следует с помощью resize().

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[3]: как задать размер вектора в STL
От: _nn_  
Дата: 23.11.04 10:12
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>_nn_ wrote:


>> Изменять размер следует через функцию resize.

>>
>>
>> vector<int> x;
>>
>> x.resize(10); // 10 элементов
>> x.resize(100); // 100 элементов
>>


ME>Наверное, будет более правильно сказать, что изменять в размер только в большую сторону следует с помощью resize().


Что-то я вас не понял.

ME>--

ME>Maxim Yegorushkin
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: как задать размер вектора в STL
От: MaximE Великобритания  
Дата: 23.11.04 10:54
Оценка:
_nn_ wrote:

>>> Изменять размер следует через функцию resize.


[]

> ME>Наверное, будет более правильно сказать, что изменять в размер только в большую сторону следует с помощью resize().

>
> Что-то я вас не понял.

resize() для vector<> никогда не освобождает занятую память. Чтобы ее реально освободить нужен трюк:

std::vector<int> v;
assert(v.capacity() == 0);

v.resize(100);
assert(v.capacity() >= 100);

v.resize(0);
assert(v.capacity() >= 100);

std::vector<int>(v).swap(v); // трюк
assert(v.capacity() == 0);


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[5]: как задать размер вектора в STL
От: Зверёк Харьковский  
Дата: 23.11.04 10:58
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>
ME>std::vector<int>(v).swap(v); // трюк
ME>assert(v.capacity() == 0);
ME>

Люди кажуть, что и это не всегда работает (кажется Меерс в ЭффективSTL-е говорил, что может и не сработать).
сам слушаю и вам рекомендую: 03 — К тебе я полечу
FAQ — це мiй ай-кью!
Re[6]: как задать размер вектора в STL
От: MaximE Великобритания  
Дата: 23.11.04 11:32
Оценка:
Зверёк Харьковский wrote:

> Люди кажуть, что и это не всегда работает (кажется Меерс в ЭффективSTL-е говорил, что может и не сработать).


Да, гарантии нет.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: как задать размер вектора в STL
От: Данилович Алексей  
Дата: 23.11.04 11:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Данилович Алексей, Вы писали:


B>Для изменения размера вектора используется ф-я resize. Так же посмотри еще в сторону reserve.

B>Твои способы в принципе тоже корректны, но выглядят как-то небычно что ли...
B>Что касается ошибки — то скорее всего где-то вылез за пределы массива. Попробуй вместо operator[]
B>использовать at() — эта функция проверяет нидекс на валидность, и в случае чего кидает исключение:

B>
B>vector<int> v;
B>v.resize(10);
B>v.at(10) = 0;//exception
B>


Врядли я где-то успел вылезти за границы — это первое, что с вектором я делаю. подозреваю осбенности реализации STL для билдера, ибо то, что Вы назвали странным, подчерпано из Страуструпа. Спасибо за resize, видимо всплывает то, что по-порядку его читать нет времени.
Re[3]: как задать размер вектора в STL
От: What Беларусь  
Дата: 25.11.04 06:13
Оценка:
Здравствуйте, Данилович Алексей, Вы писали:

ДА>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Данилович Алексей, Вы писали:


B>>Для изменения размера вектора используется ф-я resize. Так же посмотри еще в сторону reserve.

B>>Твои способы в принципе тоже корректны, но выглядят как-то небычно что ли...
B>>Что касается ошибки — то скорее всего где-то вылез за пределы массива. Попробуй вместо operator[]
B>>использовать at() — эта функция проверяет нидекс на валидность, и в случае чего кидает исключение:

B>>
B>>vector<int> v;
B>>v.resize(10);// В векторе 10 элементов с индексами 0..9
B>>v.at(10) = 0;//exception  <- Выход за границы вектора!
B>>
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: как задать размер вектора в STL
От: LaptevVV Россия  
Дата: 25.11.04 06:25
Оценка:
Здравствуйте, Данилович Алексей, Вы писали:

B>>Для изменения размера вектора используется ф-я resize. Так же посмотри еще в сторону reserve.

B>>Твои способы в принципе тоже корректны, но выглядят как-то небычно что ли...
B>>Что касается ошибки — то скорее всего где-то вылез за пределы массива. Попробуй вместо operator[]
B>>использовать at() — эта функция проверяет нидекс на валидность, и в случае чего кидает исключение:

B>>
B>>vector<int> v;
B>>v.resize(10);
B>>v.at(10) = 0;//exception
B>>


ДА>Врядли я где-то успел вылезти за границы — это первое, что с вектором я делаю. подозреваю осбенности реализации STL для билдера, ибо то, что Вы назвали странным, подчерпано из Страуструпа. Спасибо за resize, видимо всплывает то, что по-порядку его читать нет времени.

1. С билдером все в порядке ибо у него STLport используется.
2. В векторе. как в массиве, нумерация от 0 до 9, поэтому 10 вызывает исключение.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.