Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 09, 2011, 04:13



Название: std::vector как отрубить хвосты ?
Отправлено: Igors от Сентябрь 09, 2011, 04:13
Добрый день

Хочется использовать std::vector (необходимо приведение к С массиву). Когда данные накапливаются в векторе, он сам распределяет пул/запас, используя больше памяти чем есть элементов. Против этого никто не возражает. Но вот когда данные накоплены, нужно избавиться от этого пула. В Qt такие ф-ции называются squeeze().  Экспериментируем в gcc 4.2

Печать
Код
C++ (Qt)
static void PrintVec( const char * title, const std::vector <int> & vec )
{
printf("%s size = %ld, capacity = %ld\n", title, vec.size(), vec.capacity());
}
 

Код
C++ (Qt)
std::vector <int> test;
 
test.resize(12100);
PrintVec("resize 12100", test);  // (печатает) resize 12100 size = 12100, capacity = 12100 (ну гуд)
 
test.resize(12200);
PrintVec("resize 12200", test); // resize 12200 size = 12200, capacity = 24200 (решил запастись, ну ладно)
 
test.reserve(0);        
PrintVec("reserve 0", test);  // reserve 0 size = 12200, capacity = 24200 (на уменьшение reserve бесполезно)
 
std::vector <int> test2(test);  
PrintVec("test2", test2); // test2 size = 12200, capacity = 12200 (запас не копируется конструктором)
 
test.clear();
test.reserve(0);
PrintVec("clear & reserve", test);  // clear & reserve size = 0, capacity = 24200 (зачистка не помогат)
 
// ладно, сделаю через 2 присвоения, но..
test = test2;
PrintVec("test = test2", test);  // test = test2 size = 12200, capacity = 24200 (от мертвого осла уши  :'()
 

Так как же все-таки избавиться от пула?

Спасибо


Название: Re: std::vector как отрубить хвосты ?
Отправлено: brankovic от Сентябрь 09, 2011, 09:20
ну вы же сами пишите "запас не копируется":

test.swap (test2);
test2.clear ();

то же, но короче:

std::vector <int> (test).swap (test);


Название: Re: std::vector как отрубить хвосты ?
Отправлено: Пантер от Сентябрь 09, 2011, 09:27
У Страуструпа было это решение.


Название: Re: std::vector как отрубить хвосты ?
Отправлено: Igors от Сентябрь 09, 2011, 12:18
ну вы же сами пишите "запас не копируется":

test.swap (test2);
test2.clear ();

то же, но короче:

std::vector <int> (test).swap (test);
Да, видимо это лучшее. Спасибо


Название: Re: std::vector как отрубить хвосты ?
Отправлено: Akon от Сентябрь 10, 2011, 19:06
В новом стандарте есть vector::shrink_to_fit().
http://msdn.microsoft.com/en-us/library/dd647619.aspx (http://msdn.microsoft.com/en-us/library/dd647619.aspx)