Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

Еще читал что нужно использовать векторы, но я еще STL не изучал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 19:58     не очень понял про динамическое выделение памяти.
Посмотрите здесь:

Динамическое выделение памяти - C++
Почему распечатка матрицы Matr1 в f2 дает матрицу из ед., а в f1 матрицу из нулей? Ведь адрес первого эл. массива Matr2 сохранен в...

Динамическое выделение памяти - C++
Первый раз столкнулся с такой задачей... Дали лабораторную работу: Разработать приложения, реализующее следующие функции: 1) Выделяет...

Динамическое выделение памяти - C++
Здравствуйте! Помогите пожалуйста, мне задали сделать чтобы в выделенном (выделить не удалось, оставил теги B, там где идёт "объявляем и...

Динамическое выделение памяти - C++
Уважаемые программисты!!!! Подскажите как выделить память для двумерного массива. Заранее спасибо!!!

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.10.2010, 19:59     не очень понял про динамическое выделение памяти. #2
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
manking
1 / 1 / 0
Регистрация: 28.09.2010
Сообщений: 106
04.10.2010, 20:12  [ТС]     не очень понял про динамическое выделение памяти. #3
Цитата Сообщение от Lavroff Посмотреть сообщение
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
А эти векторы производительность не сильно уменьшат?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.10.2010, 20:13     не очень понял про динамическое выделение памяти. #4
manking, Достаточно. Но использовать
std::string* - не самое рациональное решение ИМХО. Тогда уж массив char** или char*[]
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.10.2010, 20:16     не очень понял про динамическое выделение памяти. #5
manking,
Вы на глазок и не почувствуете
Хотя это смотря в какой программе)))
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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;
}
manking
1 / 1 / 0
Регистрация: 28.09.2010
Сообщений: 106
04.10.2010, 21:05  [ТС]     не очень понял про динамическое выделение памяти. #7
Да выглядит подторможено.

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

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

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

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

Спасибо!
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.10.2010, 21:14     не очень понял про динамическое выделение памяти. #8
А посчитать файлы в папке (счетчик в программке), а затем уже выделять память под дин. массив?
CyBOSSeR
Эксперт C++
2300 / 1670 / 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;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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;
}
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:42     не очень понял про динамическое выделение памяти. #11
Lavroff, вектор по определенному закону перераспределяет память под свои элементы. Пройдись отладчиком по коду push_back'а - все станет понятно.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.10.2010, 21:43     не очень понял про динамическое выделение памяти. #12
CyBOSSeR, Ну да. Уже понял. Спасибо
CyBOSSeR
Эксперт C++
2300 / 1670 / 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);
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 21:55     не очень понял про динамическое выделение памяти.
Еще ссылки по теме:

Динамическое выделение памяти - C++
Есть следующее объявление #include&lt;iostream&gt; #define MAX 1000 //======================= int arr; int arr2; int arr3; ...

Динамическое выделение памяти - C++
Использовать динамическое выделение памяти для программы : #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include...

Динамическое выделение памяти! - C++
Программа должна читать с клавы число и имя(до 15 символов). Данные должны вводится в одной функции а выводится во второй. Сохранять данные...

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

Динамическое выделение памяти - C++
есть код: int u = 0; char* mstrcat(char *str1, char *str2) { u = sizeof(str1); // *str1 = new char; char *res = str1; ...


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

Или воспользуйтесь поиском по форуму:
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
04.10.2010, 21:55     не очень понял про динамическое выделение памяти. #15
Цитата Сообщение от Lavroff Посмотреть сообщение
1 у массива, против 14 у вектора. Менее ощутимо. Но все же
14 чего? Секунд? Это при выделенной заранее памяти?

Добавлено через 1 минуту
Не VS используешь случайно?
Yandex
Объявления
04.10.2010, 21:55     не очень понял про динамическое выделение памяти.
Ответ Создать тему
Опции темы

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