Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
manking
1 / 13 / 0
Регистрация: 28.09.2010
Сообщений: 108
#1

не очень понял про динамическое выделение памяти. - C++

04.10.2010, 19:58. Просмотров 1300. Ответов 21
Метки нет (Все метки)

У меня есть массив строк состоящий из 100 элементов
C++
1
2
string *строки;
строки = new string [100];
Но при использовании я не знаю сколько всего элементов массива будет задействовано.
то есть может быть только 2 значения
C++
1
2
строки[3] = "предложение 1";
строки[44] = "предложение 2";
1) При динамическом выделении памяти для массива в данном случаи,
общий размер массива будет равен размеру этих 2 элементов или в любом случаи для всех 100 элементов будет выделена память?

2) Что если элементов в массиве, станет больше чем прописано? Можно ли будет расширить массив?

Еще читал что нужно использовать векторы, но я еще STL не изучал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 19:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос не очень понял про динамическое выделение памяти. (C++):

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Динамическое выделение памяти - C++
Создайте динамический массив, хранящий в первой строке имя, а во второй - телефон. Организуйте поиск по имени и по номеру телефона и...

Динамическое выделение памяти - C++
Здраствуйте. Собственно сам код и вопрос: почему могу свободно выходить за границы массива? Для чего тогда размерность указывается......

Динамическое выделение памяти - C++
создать динамический масив, создать функцию, которая сумирует все елементы масива, и функцию, которая печатает содержимое масива и...

Динамическое выделение памяти - C++
Вот у меня есть 2 примера: char* str = "Немыслимый текст"; char* s = new char ; Тут указатель s будет указывать на блок в...

Динамическое выделение памяти - C++
Доброго времени суток всем!:) Есть такая проблема... Дан класс полином. который содержит закрытые члены коэффициент и степень полинома, а...

21
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 19:59 #2
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
0
manking
1 / 13 / 0
Регистрация: 28.09.2010
Сообщений: 108
04.10.2010, 20:12  [ТС] #3
Цитата Сообщение от Lavroff Посмотреть сообщение
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
А эти векторы производительность не сильно уменьшат?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 20:13 #4
manking, Достаточно. Но использовать
std::string* - не самое рациональное решение ИМХО. Тогда уж массив char** или char*[]
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.10.2010, 20:16 #5
manking,
Вы на глазок и не почувствуете
Хотя это смотря в какой программе)))
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 20:35 #6
silent_1991, Ну если массив из 1000 элементов и вектор из 1000 элементов... Наверное будет заметна разница.

Добавлено через 6 минут
Вектор заполняется от одинакового времени до 0.002 в сравнении с массивом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=1000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
        delete[] Arr;
    return 0;
}
В этом случае разница заметна. Массив - 0.012, вектор - 0.694
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=1000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
        delete[] Arr;
    return 0;
}
В этом случае - все еще жестче. 0.146 у массива и 6 с лихом секунд у вектора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=10000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    delete[] Arr;
    return 0;
}
Добавлено через 11 минут
Секунда с чем-то у массива. И около 80 у вектора.
Вообщем заметно даже очень.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=100000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    delete[] Arr;
    return 0;
}
0
manking
1 / 13 / 0
Регистрация: 28.09.2010
Сообщений: 108
04.10.2010, 21:05  [ТС] #7
Да выглядит подторможено.

Я функцию использую которая смотрит сколько файлов в каталоге.
И все имена файлов попадают в массив.

Но в папке может быть и не 10 файлов а 50000.

и если массив объявить 500 000 элементов то программа выполняется больше чем за 2 секунды.
А если объявить меньше чем в папке оказывется, то выходит ошибка.

Вот я и искал, как в процессе выполнения увеличить ёмкость массива если понадобиться.

Спасибо!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 21:14 #8
А посчитать файлы в папке (счетчик в программке), а затем уже выделять память под дин. массив?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:25 #9
Lavroff, если тебе заранее известно количество элементов, которые должен будет хранить вектор, то почему ты не используешь перегруженную версию конструктора, принимающую количество элементов?
Попробуй:
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
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for(std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec(size);
  for(std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 21:41 #10
CyBOSSeR, То есть в основном из-за push_back?

Добавлено через 2 минуты
1 у массива, против 14 у вектора. Менее ощутимо. Но все же.

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
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for(std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec(size);
  for(std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:42 #11
Lavroff, вектор по определенному закону перераспределяет память под свои элементы. Пройдись отладчиком по коду push_back'а - все станет понятно.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 21:43 #12
CyBOSSeR, Ну да. Уже понял. Спасибо
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:48 #13
Lavroff, я чутка попутал, не надо ничего передавать в конструктор. Нужно вызвать resize.
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
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 1000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for (std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec;
  vec.resize(size);
  for (std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
Проверь.

В принципе, можно заменить:
C++
1
vec.resize(size);
на
C++
1
vec.reserve(size);
и
C++
1
vec[i] = i;
на
C++
1
vec.push_back(i);
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 21:53 #14
1 к 12

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
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for (std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec;
  vec.resize(size);
  for (std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
04.10.2010, 21:55 #15
Цитата Сообщение от Lavroff Посмотреть сообщение
1 у массива, против 14 у вектора. Менее ощутимо. Но все же
14 чего? Секунд? Это при выделенной заранее памяти?

Добавлено через 1 минуту
Не VS используешь случайно?
1
04.10.2010, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 21:55
Привет! Вот еще темы с ответами:

Динамическое выделение памяти - C++
Объясните пожалуйста.Не могу понять в чём разница между malloc,calloc/free и new/delete

Динамическое выделение памяти - C++
Всем привет, читал про динам. выделение памяти и тут возник вопрос. Так как для новичков пишут книги не очень глубоко, то в книге ответа на...

Динамическое выделение памяти. - C++
Доброго времени суток. Помогите, пожалуйста, решить задачу. Задача тривиальна - поиск и замена подстроки. Суть в чем: необходимо...

Динамическое выделение памяти - C++
Доброго времени суток. Пытаюсь разобраться с динамическим выделением память. Суть: Есть структура с двумя полями: 1. Указатель...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru