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

Доскональный разбор кода C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 11:51     Доскональный разбор кода C++ #1
Ребят, объясните пожалуйста следующие строчки кода. Что происходит в результате их выполнения?
C++
1
2
int a[4] = {10, 20, 30, 40};
vector<int> v(a, a+4);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2011, 11:51     Доскональный разбор кода C++
Посмотрите здесь:

Разбор кода C++
C++ Разбор кода
Разбор кода CSharp C++
C++ Комментарии и разбор кода
C++ Разбор кода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
27.08.2011, 11:59     Доскональный разбор кода C++ #2
В первой строке создаем целочисленный массив размером 4 и сразу его заполняем.
Во второй строке создаем целочисленный вектор и инициализируем его ранее созданным массивом - http://www.cplusplus.com/reference/stl/vector/vector/
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 12:02  [ТС]     Доскональный разбор кода C++ #3
Цитата Сообщение от adamo86 Посмотреть сообщение
vector<int> v(a, a+4);
Мне интересно как происходит инициализация вектора v? Что значит первый параметр в скобках? И что значит второй параметр скобках?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
27.08.2011, 12:02     Доскональный разбор кода C++ #4
C++
1
int a[4] = {10, 20, 30, 40};
Массив размером в 4 элемента инициализируется списком.

C++
1
vector<int> v(a, a+4);
Вектор инициализуется вышеприведенным массивом. Точнее тупо копирует все, что находиться между a и a + 4(a - указатель на первый элемент массива, а так как элементы в массиве располагаются последовательно, то a + 4 указывает на элемент, следующий за 4м элементом массива).
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
27.08.2011, 12:05     Доскональный разбор кода C++ #5
Цитата Сообщение от adamo86 Посмотреть сообщение
Мне интересно как происходит инициализация вектора v?
Вызываеться такой конструктор:
C++
1
2
3
4
5
6
7
8
9
template<typename _InputIterator>
        vector(_InputIterator __first, _InputIterator __last,
           const allocator_type& __a = allocator_type())
    : _Base(__a)
        {
      // Check whether it's an integral type.  If so, it's not an iterator.
      typedef typename std::__is_integer<_InputIterator>::__type _Integral;
      _M_initialize_dispatch(__first, __last, _Integral());
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename _InputIterator>
        void
        _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
                   __false_type)
        {
      typedef typename std::iterator_traits<_InputIterator>::
        iterator_category _IterCategory;
      _M_range_initialize(__first, __last, _IterCategory());
    }
 
      // Called by the second initialize_dispatch above
      template<typename _InputIterator>
        void
        _M_range_initialize(_InputIterator __first,
                _InputIterator __last, std::input_iterator_tag)
        {
      for (; __first != __last; ++__first)
        push_back(*__first);
    }
mingw 4.6.0
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
27.08.2011, 12:05     Доскональный разбор кода C++ #6
Все элементы массива в памяти расположены последовательно.
a - указатель на первый элемент массива,
a + 4 - в данном примере указатель на следующую ячейку, после последней.

Вот конструктор и принимает два указателя. Пример по ссылке выше.
vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 12:33  [ТС]     Доскональный разбор кода C++ #7
Цитата Сообщение от diagon Посмотреть сообщение
Вектор инициализуется вышеприведенным массивом. Точнее тупо копирует все, что находиться между a и a + 4(a - указатель на первый элемент массива, а так как элементы в массиве располагаются последовательно, то a + 4 указывает на элемент, следующий за 4м элементом массива).
Я не пойму. Если "между", то a, то есть первый элемент массива не должен был копироваться, ведь a+4 не копируется. Получается a включительно копируется.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.08.2011, 12:49     Доскональный разбор кода C++ #8
Получается, что копируется диапазон [a; a+4)
Надеюсь чем отличается квадратная скобка от круглой объяснять не надо)
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 15:05  [ТС]     Доскональный разбор кода C++ #9
Необходимо разобраться в следующем коде:
C++
1
2
3
4
5
6
7
    string s = "1234567890";
    vector<int> a;
    for (int i=(int)s.length(); i>0; i-=9)
        if (i < 9)
            a.push_back (atoi (s.substr (0, i).c_str()));
        else
            a.push_back (atoi (s.substr (i-9, 9).c_str()));
1) Что делать 5 строка в общем?
2) Что из себя представляет функция substr()? Какие параметры ей передаются?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.08.2011, 15:11     Доскональный разбор кода C++ #10
касательно substr - клик
касательно c_str() - клик2
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.08.2011, 15:13     Доскональный разбор кода C++ #11
Цитата Сообщение от diagon Посмотреть сообщение
Точнее тупо копирует все, что находиться между a и a + 4(a - указатель на первый элемент массива, а так как элементы в массиве располагаются последовательно, то a + 4 указывает на элемент, следующий за 4м элементом массива).
Добавлю про a+4. Если к переменной-указателю прибавляется 1, то ее значение увеличивается на количество байт данного типа, поэтому при a+4 к a добавляется 4*sizeof(a) байт
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 16:17  [ТС]     Доскональный разбор кода C++ #12
Необходимо разобраться в следующем коде:
C++
1
2
3
4
5
6
7
8
9
10
class Point {
public:
  double x;
  double у;
};
 
Point::Point (double _х, double _y):
   х (), у ()
{
}
Мне не понятен этот конструктор (строка 7). Точнее понятен, что происходит инициализация переменных класса Point - x и y. Но чем отличается это конструктор от следующего:
C++
1
2
3
4
5
Point::Point (double _х, double _y)
{
x = _x;
    у = _y;
}
LosAngeles
Заблокирован
27.08.2011, 16:30     Доскональный разбор кода C++ #13
этот ничем не отличается, а вот если бы вместо double был бы string к примеру, то сначала кажись должен конструтор по умолчанию вызваться, а потом только оператор присваивания в теле конструктора, что не есть гуд, когда можно оператор копирования замутить прямо в списке инициализации
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
27.08.2011, 16:35  [ТС]     Доскональный разбор кода C++ #14
Цитата Сообщение от LosAngeles Посмотреть сообщение
этот ничем не отличается, а вот если бы вместо double был бы string к примеру, то сначала кажись должен конструтор по умолчанию вызваться, а потом только оператор присваивания в теле конструктора, что не есть гуд, когда можно оператор копирования замутить прямо в списке инициализации
Я не совсем понял. Нельзя ли как-то на примерах показать?
LosAngeles
Заблокирован
27.08.2011, 16:40     Доскональный разбор кода C++ #15
У тебя отладчик есть? В vs помоему на f11 жмёшь это Trace into набери два конструктора со string и посмотри сам разницу
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.08.2011, 16:42     Доскональный разбор кода C++ #16

Сабж: Роберт Лафоре "В теле конструктора, как правило, производятся более сложные вещи, чем инициализация. "
Где-то я слышал, что инициализация, типа Num(0) быстрее, чем в теле конструктора. Хотя, возможно, я ошибаюсь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 16:43     Доскональный разбор кода C++
Еще ссылки по теме:

C++ Разбор кода программы
Разбор кода C++
C++ Подробный разбор кода

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
27.08.2011, 16:43     Доскональный разбор кода C++ #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
Point::Point (string _х, string _y):
   х (), у () //Сразу конструктор копирования вызывается
{
}
 
Point::Point (string _х, string _y) 
{
//Конструкторы по умолчанию
//Операторы присваивания
  x = _x;
  у = _y;
}
Yandex
Объявления
27.08.2011, 16:43     Доскональный разбор кода C++
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru