Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116

Vector::shrink_to_fit

04.04.2015, 02:34. Показов 5232. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    vector<int> one, two;
    for(int i = 0; i < 30; ++i) {
        one.push_back(1);
    }
 
    for(int i = 0; i < 30; ++i) {
        cout << one[i] << ' ';
    }
    cout << endl;
 
    for(int i = 0; i < 15; ++i) {
        two.push_back(2);
    }
 
    for(int i = 0; i < 15; ++i) {
        cout << two[i] << ' ';
    }
    cout << endl;
 
    one = two;
 
    one.shrink_to_fit();
 
    cout << one.size() <<' ' <<one.capacity() << endl;
}
При компиляции выдает :
error: class std::vector<int> has no member named 'shrink_to_fit()'

Как такое может быть?
Комилятор mingw 4.8.1
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2015, 02:34
Ответы с готовыми решениями:

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Цикл: Создайте класс Matrix на базе вектора vector<vector<int>>.
Создайте класс Matrix на базе вектора vector&lt;vector&lt;int&gt;&gt;. Определите операторную функцию ostream\&amp; operator&lt;&lt;(ostream\&amp;,...

49
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.04.2015, 11:57
Студворк — интернет-сервис помощи студентам
pety, Препроцессор не поможет, хотя сейчас есть уже вообщем-то предложение добавлять спец. дефайны, поддерживается или нет конкретная фича.
Можно через compile-time проверки сделать.
Если без зависимостей от boost, C++11 то как-то так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
template<typename T, T v>
struct integral_constant
{
   typedef T type;
   static const T value = v;
};
 
template<bool P, typename T = void>
struct enable_if
{
   typedef T type;
};
 
template<typename T>
struct enable_if<false, T>
{
};
 
template <typename T, typename NameGetter>
struct has_member_impl
{
    typedef char matched_return_type;
    typedef int unmatched_return_type;
    
    template <typename C>
    static matched_return_type f(typename NameGetter::template get<C>*);
    
    template <typename C>
    static unmatched_return_type f(...);
    
public:
    static const bool value = (sizeof(f<T>(0)) == sizeof(matched_return_type));
};
 
template <typename T, typename NameGetter>
struct has_member :
        integral_constant<bool, has_member_impl<T, NameGetter>::value>
{ };
 
template<typename T>
struct check_has_shrink_to_fit
{
   template<typename U,
      void (U::*)() = &U::shrink_to_fit>
   struct get {};
};
 
template<typename T>
struct has_shrink_to_fit : has_member<T, check_has_shrink_to_fit<T> >
{
};
 
template<typename Container>
void shrink_to_fit(Container& cnt, typename enable_if<has_shrink_to_fit<Container>::value>::type* = 0)
{
   cnt.shrink_to_fit();
}
 
template<typename Container>
void shrink_to_fit(Container& cnt, typename enable_if<!has_shrink_to_fit<Container>::value>::type* = 0)
{
   Container().swap(cnt);
}
Пример использования

C++
1
2
3
4
5
6
7
int main()
{
   std::list<int> lst;
   shrink_to_fit(lst);
   std::vector<int> v;
   shrink_to_fit(v);
}
Добавлено через 19 минут
В С++11-14 можно сделать легче и правильнее. Так же можно просто пойти через decltype, вместо void_t.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <type_traits>
 
template<typename...>
using void_t = void;
 
template<typename Container, class = void>
struct has_shrink_to_fit : public std::integral_constant<bool, false>
{
};
 
template<typename Container>
struct has_shrink_to_fit<Container, void_t<decltype(&Container::shrink_to_fit)>> :
public std::integral_constant<bool, true>
{
};
 
template<typename Container, class = void>
struct is_swapable : public std::integral_constant<bool, false>
{
};
 
template<typename Container>
struct is_swapable<Container, void_t<decltype(&Container::swap)>> :
public std::integral_constant<bool, true>
{
};
 
template<typename T>
void shrink_to_fit(T& value, typename std::enable_if<has_shrink_to_fit<T>::value>::type* = 0)
{
   value.shrink_to_fit();
}
 
template<typename T>
void shrink_to_fit(T& value, typename std::enable_if<!has_shrink_to_fit<T>::value && is_swapable<T>::value>::type* = 0)
{
   T().swap(value);
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.04.2015, 12:43
Цитата Сообщение от ForEveR Посмотреть сообщение
Препроцессор не поможет
Почему не поможет? Можно же проверять значение __cplusplus, например на равенство 201103L.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.04.2015, 12:49
DrOffset, А, ну да.) Что-то я совсем, согласен, хотя есть наверное возможность что С++11 есть, но shrink_to_fit нет.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
19.12.2020, 21:14
Здравствуйте,

Подскажите пожалуйста, shrink_to_fit - это по сути аналог функции delete[] ?

C++
1
2
3
4
5
6
7
8
char* my_char = new char[100];
 
vector<char>vector_char;
vector_char.resize(100);
 
 
delete[] my_char;
vector_char.shrink_to_fit();
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.12.2020, 21:35
Optimus11, нет.
shrink_to_fit убирает только запас памяти контейнера, уже занятая и инициализированная память остается на месте.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
19.12.2020, 21:38
Цитата Сообщение от DrOffset Посмотреть сообщение
Optimus11, нет.
shrink_to_fit убирает только запас памяти контейнера, уже занятая и инициализированная память остается на месте.
Да, я немного неправильно написал, вот так должно быть:

C++
1
2
3
4
vector_char.resize(100);
 
vector_char.clear();
vector_char.shrink_to_fit();
То есть это получается не совсем аналог delete[], так как сначала нужно удалить сам size и только потом саму память.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
20.12.2020, 00:55
Optimus11, зачем тебе об этом беспокоиться? Надеюсь ты понимаешь, что в работе с вектором не нужны никакие аналоги delete перед завершением работы? В отличие от массивов!
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
20.12.2020, 09:09
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Optimus11, зачем тебе об этом беспокоиться? Надеюсь ты понимаешь, что в работе с вектором не нужны никакие аналоги delete перед завершением работы? В отличие от массивов!

Ну наверное это не совсем так ? Выделенную через malloc/new память, тоже можно не освобождать, к примеру я эту память захочу переиспользовать.

Чем принципиально выделенная память через new, отличается от выделенной памяти через resuze, reserve в векторе ? Если я правильно понимаю ничем. Внктор это просто более удобный способ работы с этой памятью.
?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
20.12.2020, 16:35
Optimus11, неправильно понимаешь.
Цитата Сообщение от Optimus11 Посмотреть сообщение
Выделенную через malloc/new память, тоже можно не освобождать, к примеру я эту память захочу переиспользовать.
нет, я именно о тех случаях, когда выделенную malloc/new память освобождать стоит обязательно. Например
C++
1
2
3
4
5
6
while(true) {
  vector<int> v(10000);//память не утекает
}
while(true) {
  int* v=new int[10000];//память утекает
}
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
20.12.2020, 17:26
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Optimus11, неправильно понимаешь.
нет, я именно о тех случаях, когда выделенную malloc/new память освобождать стоит обязательно. Например
C++
1
2
3
4
5
6
while(true) {
  vector<int> v(10000);//память не утекает
}
while(true) {
  int* v=new int[10000];//память утекает
}
Ну в случае, когда одному и тому же указателю присваивается новый адрес на участок памяти без освобождения старой, то да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.12.2020, 17:26

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include...

vector<Struct2{int,vector<struct1>}> или множественное наследование ...
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...

Как корректно скопировать vector в vector внутри класса
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Указатель на объект вектор в векторе vector < vector<int>* >*
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; int main( ) { using...

Как сложить два vector и записать в третий vector ?
Не получается сложить два вектора по элементно и записать в третий . Складываю уже переведенные числа из десятичной в восьмеричной системе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru