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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
#1

Узнать размер массива - C++

15.08.2012, 17:04. Просмотров 1801. Ответов 11
Метки нет (Все метки)

есть 2 указателя на первый элемент массива и указатель на элемент после последнего

можно ли как-то узнать размер этого массива не используя цикл
C++
1
2
3
4
while (beg != end) {
count++;
beg++;
}
если массив будет большой будет слишком долго
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2012, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Узнать размер массива (C++):

Как узнать размер массива? - C++
Нужно узнать размер введенного пользователем массива, но sizeof() почему-то не работает, помогите пожалуйста разобраться! int...

Как узнать размер массива - C++
В задаче нужно для решения узнать размер массива. Если sizeof() возвращает кол-во занятой памяти в байтах, и sizeof(char)=2, то ...

Как узнать размер массива? - C++
Имею функцию template <typename T> int funk(T mas, T element) { //kod }

Узнать размер динамического массива - C++
Здравствуйте. Пытаюсь сделать динамический массив и вывести его размерность. Выводится размерность = 4, подскажите пожалуйста где я...

Узнать размер массива строк string - C++
Есть массив строк string. Например, {"asd", "qwe", "zxc"} Как узнать его размеры? через .length(), .size(), sizeof(str)/sizeof(str)...

Узнать размер (количество) массива объектов класса - C++
Допустим, у меня есть такой массив объектов: TGameEnemy enemies = { TGameEnemy(), TGameEnemy(), TGameEnemy() }; Мне необходимо...

11
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 17:17 #2
C++
1
int size=(end-begin)/(sizeof тип переменной)
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.08.2012, 17:18 #3
cossack5, Если массив статический
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
15.08.2012, 17:19  [ТС] #4
в общем у меня класс получает указатели на первый и после последнего элементы массива
в задаче требуется написать оператор сравнения
в теории
1) он проверяет размеры массивов, если не равны сразу возвращает false
2) если размеры равны, проверяет каждый элемент, если встречаются не равные элементы возвращает false

вот класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CheckedPtr
{
public:
    CheckedPtr(int *b, int *e) : beg(b), end(e), curr(b) {}
 
    CheckedPtr& operator++();
    CheckedPtr& operator--();
    CheckedPtr operator++(int);
    CheckedPtr operator--(int);
 
    int &operator[](const std::size_t);
    const int &operator[](const std::size_t) const;
 
    int& operator*();
    const int& operator*() const;
 
    friend bool operator==(const CheckedPtr&, const CheckedPtr&);
 
private:
    int *beg;
    int *end;
    int *curr;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool operator==(const CheckedPtr &lhs,  const CheckedPtr &rhs)
{
    std::size_t sizelhs(0);
    int *bgl = lhs.beg;
    while (bgl != lhs.end) {
        sizelhs++;
        bgl++;
    }
    std::size_t sizerhs(0);
    int *bgr = rhs.beg;
    while (bgr != rhs.end) {
        sizerhs++;
        bgr++;
    }
    if(sizelhs == sizerhs
        return false;
}
не дописан еще
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 17:23 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
cossack5, Если массив статический
Какие проблемы могут быть с динамическим?

Добавлено через 2 минуты
Ах, да, у вас же другой динамический...
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
15.08.2012, 17:36  [ТС] #6
вот дописал, можно ли что-то заменить?
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
bool operator==(const CheckedPtr &lhs,  const CheckedPtr &rhs)
{
    std::size_t sizelhs(0);
    int *bgl = lhs.beg;
    while (bgl != lhs.end) {
        ++sizelhs;
        ++bgl;
    }
    bgl = lhs.beg;
    std::size_t sizerhs(0);
    int *bgr = rhs.beg;
    while (bgr != rhs.end) {
        ++sizerhs;
        ++bgr;
    }
    bgr = rhs.beg;
    if(sizelhs != sizerhs) 
        return false;
    else {
        while (bgl != lhs.end || bgr != rhs.end) {
            if (*bgl != *bgr)
                return false;
            else {
                bgl++;
                bgr++;
            }
        }
    }
    return true;
}
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.08.2012, 18:38 #7
cossack5, Да не, я был не прав. Расстояние между элементами определяется именно так, но все же деление на sizeof(T) лишнее.
1
Catstail
Модератор
22640 / 11009 / 1785
Регистрация: 12.02.2012
Сообщений: 18,170
15.08.2012, 19:14 #8
Цитата Сообщение от ForEveR Посмотреть сообщение
но все же деление на sizeof(T) лишнее.
- не лишнее (если нужен размер не в байтах, а в ячейках соотв. типа)
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
15.08.2012, 19:22  [ТС] #9
Цитата Сообщение от Catstail Посмотреть сообщение
- не лишнее (если нужен размер не в байтах, а в ячейках соотв. типа)
в любом случае оно выдавало 1 в моей задаче(массивы имели размер 10 и 9 элементов), не знаю, вроде все правильно делал
0
Catstail
Модератор
22640 / 11009 / 1785
Регистрация: 12.02.2012
Сообщений: 18,170
15.08.2012, 19:33 #10
Цитата Сообщение от cossack5 Посмотреть сообщение
int size=(end-begin)/(sizeof тип переменной)
- это давало 1?

Добавлено через 8 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
но все же деление на sizeof(T) лишнее.
- да. Действительно лишнее. При вычитании указателей размер элемента учитывается. Это чтобы определить размер в байтах, нужно умножить на sizeof. Пардон!
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.08.2012, 19:35 #11
Разность указателей — это разность индексов массива, если это указатели из того же массива. Делить на sizeof не надо. (Пункт 5.7/6 стандарта).
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
15.08.2012, 19:47  [ТС] #12
Цитата Сообщение от Catstail Посмотреть сообщение
- это давало 1?
с делением давало 1, щас переписал без деления все отлично работает
спасибо за помощь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2012, 19:47
Привет! Вот еще темы с ответами:

Как узнать размер массива в динамической памяти? - C++
Добрый вечер еще раз! Напишите пожалуйста как можно узнать истинный размер массива, находящегося в динамической памяти, созданными при...

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Узнать размер консоли - C++
Как узнать размер консольного окна, куда программа выводит данные? Сколько символов "влазит" по вертикали и горизонтали. ...

Узнать размер файла - C++
Мне нужно прочитать обычный текстовый файл. Я думаю это сделать с помощью одной из функций семейства get(). Для этого (и не только) мне...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
15.08.2012, 19:47
Ответ Создать тему
Опции темы

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