Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350
1

Узнать размер (количество) массива объектов класса

21.10.2012, 18:51. Показов 5716. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим, у меня есть такой массив объектов:

C++
1
TGameEnemy enemies[] = { TGameEnemy(), TGameEnemy(), TGameEnemy() };
Мне необходимо узнать его размер - количество элементов. Я знаю, что их три.
Но что же делать при работе с этим массивом объектов, если он во время работы программы удалится и объявится заново уже с другим кол-вом объектов? Все циклы тогда работать перестанут.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2012, 18:51
Ответы с готовыми решениями:

Как узнать размер в байтах графических объектов
Здравствуйте. Как программно узнать размер в байтах графических объектов - графических путей,...

Как узнать размер объектов cin и cout в среде Code::Blocks
Всем привет!Уважаемые, не подскажите как узнать размер объектов cin и cout в среде Code::Blocks.С...

Как узнать размер объекта класса?
Здравствуйте, Дамы и Господа! Есть ли функция, передающая значение количества байт, отведенных в...

Как узнать размер сериализируемого класса?
Привет. Проблема вообще вот в чем, мне необходимо передать класс по сети, для этого, ясен пень,...

15
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
21.10.2012, 19:00 2
Используйте vector
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
21.10.2012, 19:04 3
Цитата Сообщение от Gooman Посмотреть сообщение
Допустим, у меня есть такой массив объектов:
C++
1
TGameEnemy enemies[] = { TGameEnemy(), TGameEnemy(), TGameEnemy() };
Мне необходимо узнать его размер - количество элементов. Я знаю, что их три.
Но что же делать при работе с этим массивом объектов, если он во время работы программы удалится и объявится заново уже с другим кол-вом объектов? Все циклы тогда работать перестанут.
Работа с массивом это слишком общее понятие. Если вы имеете в виду передачу в функции, то передавайте размер дополнительным параметром. Если удалили и объявили вновь, не забудьте обновить переменную, где храните размер, если не передаёте явно.
Ну и если скорость не критична, используйте vector.
1
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
21.10.2012, 19:10 4
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну и если скорость не критична, используйте vector.
А какие потери скорости у vector по сравнению с обычным массивом?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
21.10.2012, 19:12 5
Цитата Сообщение от defer Посмотреть сообщение
А какие потери скорости у vector по сравнению с обычным массивом?
А Вы посмотрите код класса vector и увидите разницу =)
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
21.10.2012, 19:13 6
разве что в дебаге будет потеря скорости. в релизе все будет ок
0
Croessmah
21.10.2012, 19:15
  #7

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
разве что в дебаге будет потеря скорости. в релизе все будет ок
Да ладно? )))

0
10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350
21.10.2012, 19:17  [ТС] 8
Буду использовать глобальную переменную, менять ее значение при новом объявлении массива объектов. А то у меня и так проблемы с реакцией в таймерах.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
21.10.2012, 19:20 9
Croessmah, потестируйте
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
21.10.2012, 19:28 10
Gooman, Как-то так
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
typedef int MyType;
 
int main()
{
    MyType a, b, c;
    MyType MyArr[] = { a, b, c};
    std::cout << sizeof MyArr / sizeof *MyArr << std::endl;
}
http://ideone.com/gXN5Pe
Bash
1
3
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
21.10.2012, 19:46 11
Цитата Сообщение от I.M. Посмотреть сообщение
Croessmah, потестируйте
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 <vector>
#include <iostream>
#include <time.h>
int main(){
    std::vector<double> vec;
    const size_t  N=10000;
    //vec.reserve(N);
    double mas[N];
    vec.resize(N);
    clock_t before,after;   
    before = clock();
    for(int j=0;j<10000;++j)
    for(size_t i=0;i<vec.size();++i)
        vec[i]=123.4*32.6;
    after = clock();
    std::cout<<"vector = "<<after-before<<std::endl;
 
    before = clock();
    for(int j=0;j<10000;++j)
    for(size_t  i=0;i<N;++i)
        mas[i]=123.4*32.6;
    after = clock();
    std::cout<<"mas = "<<after-before<<std::endl;
    system("pause");
    return 0;
}
результат:
debug:
vector = 7102
mas = 229

release:
vector = 180
mas = 0
1
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 19:57 12
Croessmah, пфф.
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
#include <vector>
#include <iostream>
// #include <time.h>
#include <chrono>
int main(){
    // std::vector<double> vec;
    const size_t  N=10000;
    //vec.reserve(N);
    double mas[N];
    // vec.resize(N);
    std::vector<double> v;
    // clock_t before,after;
    // before = clock();
    auto s = std::chrono::system_clock::now();
    for(int j=0;j<10000;++j)
    for(size_t i=0;i<v.size();++i)
        v[i]=123.4*32.6;
    // after = clock();
    auto e = std::chrono::system_clock::now();
    // std::cout<<"vector = "<<after-before<<std::endl;
    std::cout << (e - s).count() << std::endl;
 
    // before = clock();
    s = std::chrono::system_clock::now();
    for(int j=0;j<10000;++j)
    for(size_t  i=0;i<N;++i)
        mas[i]=123.4*32.6;
    // after = clock();
    e = std::chrono::system_clock::now();
    // std::cout<<"mas = "<<after-before<<std::endl;
    std::cout << (e - s).count() << std::endl;
    // system("pause");
    return 0;
}
out
Код
85
594474

http://liveworkspace.org/code/... 17e032a124
Будем продолжать мерить, кхм, письки у векторов и массивов? Тогда давайте сравним, как массивы справляются с перевыделением памяти.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
21.10.2012, 20:00 13
Цитата Сообщение от Croessmah Посмотреть сообщение
результат:
debug:
vector = 7102
mas = 229
release:
vector = 180
mas = 0
Пишут, что результаты зависят от реализации, но так или иначе, а по крайней мере, проверка выхода за границы у вектора делается при каждом обращении. У массива этого нет.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 20:02 14
IGPIGP, только при использовании std::vector::at, но не std::vector::operator[]
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
21.10.2012, 20:15 15
Цитата Сообщение от soon Посмотреть сообщение
IGPIGP, только при использовании std::vector::at, но не std::vector::operator[]
В разных компиляторах это может быть по разному, но настраивается в VS, например:
http://stackoverflow.com/quest... -debug-but
Да не прибьют меня за ссылку.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
21.10.2012, 21:20 16
Croessmah,
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
#include <algorithm>
#include <vector>
#include <iostream>
#include <chrono>
 
double vector_test()
{
    const size_t  N=10000;
 
    std::vector<double> v(N);
 
    auto s = std::chrono::system_clock::now();
    for(int j=0;j<10000;++j)
        for(size_t i=0;i<N;++i)
            v[i]=123.4*32.6;
 
    auto e = std::chrono::system_clock::now();
    std::cout << (e - s).count() << std::endl;
    return *std::max_element(v.cbegin(), v.cend());
}
 
double arr_test()
{
    const size_t  N=10000;
 
    double mas[N];
 
    auto s = std::chrono::system_clock::now();
    for(int j=0;j<10000;++j)
        for(size_t  i=0;i<N;++i)
            mas[i]=123.4*32.6;
 
    auto e = std::chrono::system_clock::now();
    std::cout << (e - s).count() << std::endl;
    return *std::max_element(mas, mas+N);
}
 
int main()
{
    vector_test();
    arr_test();
    system("pause");
    return 0;
}
Моя VS2012 выдает
1500086
1510086
впрочем, числа плавают. В среднем получаются одинаковые результаты
0
21.10.2012, 21:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2012, 21:20
Помогаю со студенческими работами здесь

Создание объекта класса, который будет содержать указанное количество объектов другого класса
Здравствуйте. Я сейчас только учусь, помогите, пожалуйста. Задача такая: необходимо создать класс...

Размер массива объектов
Метод Count() подсчёта количества элементов массива (массив из сообщений) не правильно распознаёт...

Как узнать количество выделенных объектов?
Именно объектов (изображений), не ячеек

Количество объектов класса
недавно подцепил тут где то этот вопрос и меня что называется зацепило... думал думал так и не смог...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru