Russian Qt Forum
Ноябрь 23, 2024, 20:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: std::vector как отрубить хвосты ?  (Прочитано 3831 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 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 (от мертвого осла уши  :'()
 

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

Спасибо
Записан
brankovic
Гость
« Ответ #1 : Сентябрь 09, 2011, 09:20 »

ну вы же сами пишите "запас не копируется":

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

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

std::vector <int> (test).swap (test);
« Последнее редактирование: Сентябрь 09, 2011, 11:30 от brankovic » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Сентябрь 09, 2011, 09:27 »

У Страуструпа было это решение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 09, 2011, 12:18 »

ну вы же сами пишите "запас не копируется":

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

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

std::vector <int> (test).swap (test);
Да, видимо это лучшее. Спасибо
Записан
Akon
Гость
« Ответ #4 : Сентябрь 10, 2011, 19:06 »

В новом стандарте есть vector::shrink_to_fit().
http://msdn.microsoft.com/en-us/library/dd647619.aspx
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 23.