C++: вывод содержимого несуществующего элемента

Модератор: Модераторы разделов

Аватара пользователя
ArkanJR
Сообщения: 1132

C++: вывод содержимого несуществующего элемента

Сообщение ArkanJR »

Имеется следующий код:

Код: Выделить всё

#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> s;
for(int i = 10; i < 20; i++)
s.push_back(i);
for(int i = 0; i < s.size(); i++)
cout << s[i] << endl;
cout << s[15] << endl;
}

То есть, в vector<int> s помещаем десять последовательных чисел от 10 до 19:

элемент №0 - число 10;
элемент №1 - число 11;
элемент №2 - число 12;
элемент №3 - число 13;
элемент №4 - число 14;
элемент №5 - число 15;
элемент №6 - число 16;
элемент №7 - число 17;
элемент №8 - число 18;
элемент №9 - число 19.

Затем задаём номера тех элементов, содержимое которых нужно вывести на экран, в том числе элемент №15, который отсутствует в данном контейнере. Компилируем, запускаем полученный бинарник:
10
11
12
13
14
15
16
17
18
19
0

Последний 0 непонятен - ведь элемента №15, равного нулю, нет в vector<int> s.
— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс "Человек-невидимка"
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18978
Статус: ✡ иностранный агент
ОС: Debian GNU/Linux

Re: C++: вывод содержимого несуществующего элемента

Сообщение Bizdelnick »

А зачем Вы читаете то, чего нет?
Вообще, зря Вы с векторов начали, сначала с массивами бы разобрались. Там ровно то же самое: выход за пределы массива языком не контролируется, хотите - читайте. Считаете мусор какой-нибудь. Может 0, а может и нет - как повезёт.
А что касается контейнеров, для них надо итераторы использовать. Где-то в соседней теме Вам про них уже писали.

P. S. Ещё ИМХО: прежде чем начинать учить C++, надо разобраться с C. Потому что C++ и его библиотеки чуть менее, чем полностью, состоят из дырявых абстракций.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ArkanJR
Сообщения: 1132

Re: C++: вывод содержимого несуществующего элемента

Сообщение ArkanJR »

Bizdelnick писал(а):
15.11.2014 17:28
А зачем Вы читаете то, чего нет?
Вообще, зря Вы с векторов начали, сначала с массивами бы разобрались. Там ровно то же самое: выход за пределы массива языком не контролируется, хотите - читайте. Считаете мусор какой-нибудь. Может 0, а может и нет - как повезёт.
А что касается контейнеров, для них надо итераторы использовать. Где-то в соседней теме Вам про них уже писали.

P. S. Ещё ИМХО: прежде чем начинать учить C++, надо разобраться с C. Потому что C++ и его библиотеки чуть менее, чем полностью, состоят из дырявых абстракций.

Но Страуструп в своей книге "Язык программирования C++" (глава 1.6 "C и C++") пишет, что:
Знание C не является обязательным для изучения C++.
— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс "Человек-невидимка"
Спасибо сказали:

IMB
Сообщения: 2516
ОС: Debian

Re: C++: вывод содержимого несуществующего элемента

Сообщение IMB »

(http://www.cplusplus.com/reference/vector/vector/operator%5B%5D/) писал(а):std::vector::at

The function automatically checks whether n is within the bounds of valid elements in the vector, throwing an out_of_range exception if it is not (i.e., if n is greater or equal than its size).

std::vector::operator[]

A similar member function, vector::at, has the same behavior as this operator function, except that vector::at is bound-checked and signals if the requested position is out of range by throwing an out_of_range exception.



Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18978
Статус: ✡ иностранный агент
ОС: Debian GNU/Linux

Re: C++: вывод содержимого несуществующего элемента

Сообщение Bizdelnick »

ArkanJR писал(а):
15.11.2014 17:42
Страуструп в своей книге "Язык программирования C++" (глава 1.6 "C и C++") пишет

На заборе тоже много чего пишут...
А вот цитата из приведённой мной ссылки:
Закон дырявых абстракций означает, к сожалению, что абстракции не так сильно упрощают нашу жизнь, как хотелось бы. Если я обучаю программистов C++, было бы здорово, если бы мне не нужно было рассказывать им про char* и арифметику указателей, а можно было сразу перейти к строкам из стандартной библиотеки темплейтов. Но в один прекрасный день они напишут "foo"+"bar", и возникнут странные проблемы, а мне придётся всё равно объяснить им, что такое char*. Или они попытаются вызвать функцию Windows с параметром типа LPTSTR и не смогут, пока не выучат char* и указатели и Юникод и wchar_t и хедерные файлы TCHAR — все то, что просвечивает через дырки в абстракциях.
И главное:
абстракции экономят наше рабочее время, но не экономят учебное время.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C++: вывод содержимого несуществующего элемента

Сообщение drBatty »

Bizdelnick писал(а):
15.11.2014 17:28
Вообще, зря Вы с векторов начали, сначала с массивами бы разобрались.

+1
Bizdelnick писал(а):
15.11.2014 17:28
Там ровно то же самое: выход за пределы массива языком не контролируется, хотите - читайте. Считаете мусор какой-нибудь. Может 0, а может и нет - как повезёт.

хуже. Может вообще взлететь в стратосферу. Неопределённое поведение, а не только "значение".
Bizdelnick писал(а):
15.11.2014 22:29
абстракции экономят наше рабочее время, но не экономят учебное время.
ППКС
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18978
Статус: ✡ иностранный агент
ОС: Debian GNU/Linux

Re: C++: вывод содержимого несуществующего элемента

Сообщение Bizdelnick »

drBatty писал(а):
16.11.2014 01:02
хуже. Может вообще взлететь в стратосферу. Неопределённое поведение, а не только "значение".

Согласен.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C++: вывод содержимого несуществующего элемента

Сообщение drBatty »

ArkanJR писал(а):
15.11.2014 17:42
Но Страуструп в своей книге "Язык программирования C++" (глава 1.6 "C и C++") пишет, что:
Цитата
Знание C не является обязательным для изучения C++.

пишет. Под словом "знание" Страуструп подразумевает "опытный и квалифицированный программист C". А вовсе не то, что вы подумали. В C++ вредны сишные привычки, потому что многие вещи в C++ делаются проще и/или иначе, хотя можно и как в C, но это будет очень плохо.

Однако важно понимать, во что в действительности превращается что-то в std:: перед компиляцией (ага, сначала компилятор разворачивает шаблон в C++ код, а уж потом получившийся код компилирует).

Вот std::vector это шаблон, т.е. нечто такое, что только указывает, какой код строить.

ИМХО нужно:
1. узнать, как реализуются в C/C++ тривиальные коллекции типа массивов, списков, деревьев(через указатели).
2. узнать, как это реализуется в классах C++, и построить свой класс Array например
3. узнать, как и зачем нужны шаблоны и построить свой шаблон
4. узнать, как построены шаблоны STL
5. пользоваться STL
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: