С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 40
1

Как быстро обучиться работать с C++?

30.03.2017, 21:05. Показов 4126. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как быстро обучиться работать с C++?
как понять смысл C++?
какие сайты посоветуете?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2017, 21:05
Ответы с готовыми решениями:

Как быстро работать с классами
Подскажите как быстро работать с классами. В этой программе мне надо ввести все имена из класса и...

Как можно быстро обучиться языку паскаль?
Как можно быстро обучиться языку паскаль

Посоветуйте пожалуйста где можно быстро обучиться программированию ни языке С
Если не сложно скиньте пж ссылки на ресурсы

Хочу обучиться работать с сайтами
Мой друг посоветовал мне обратиться к данному форуму с целью обучения работы с сайтами. Хочу...

37
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.03.2017, 00:54 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Байт Посмотреть сообщение
Хочешь сравнивать массивы поэлементно?
Я хочу чтобы оператор == либо сравнивал значения переменных, либо не компилировался. И чтобы если я объявил аргумент функции как массив, он не превращался внезапно в указатель. У меня же аргументы типа int в указатели на int не превращаются? И, блин, если аргумент функции объявлен как int data[10], какого черта в функцию можно передать int data[1]?
Цитата Сообщение от DevAlone Посмотреть сообщение
А разве это не UB в C++?
Скажите об этом Микрософту с их SYMBOL_INFO (обратите внимание на размер массива Name в конце структуры).
Я уж не знаю как там в теории по стандарту, но по факту flexible array member используется, причем не в студенческих поделках, а в серьезных библиотеках. А раз используется, значит и поведение программы в этом случае должно быть определенным.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 00:58 22
Цитата Сообщение от Renji Посмотреть сообщение
Язык по хорошему должен как минимум выдавать ошибку в дебаг-моде. В том числе и для выхода за границы сишного массива.
Если только при отладке, то да, было бы весьма неплохо, у меня давно есть идея сделать свой велосипед транслирующийся в C++, можно будет туда добавить debug-обёртки, либо проверку во время трансляции, для распространённых ошибок, вроде попытки индексирования за границами диапазона.

Добавлено через 14 секунд
Цитата Сообщение от Renji Посмотреть сообщение
Язык по хорошему должен как минимум выдавать ошибку в дебаг-моде. В том числе и для выхода за границы сишного массива.
Если только при отладке, то да, было бы весьма неплохо, у меня давно есть идея сделать свой велосипед транслирующийся в C++, можно будет туда добавить debug-обёртки, либо проверку во время трансляции, для распространённых ошибок, вроде попытки индексирования за границами диапазона.
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.03.2017, 07:27 23
Цитата Сообщение от DevAlone Посмотреть сообщение
где каждый элемент - массив из N элементов, но тогда проблемы с произвольным доступом.
никаких проблем.
http://en.cppreference.com/w/cpp/container/deque
Цитата Сообщение от Renji Посмотреть сообщение
Я хочу чтобы...
ключевое слово - "Я".
кроме вас существуют другие люди.
Цитата Сообщение от Renji Посмотреть сообщение
И, блин, если аргумент функции объявлен как int data[10], какого черта в функцию можно передать int data[1]?
http://rextester.com/XAHEXE3943
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//g++  5.4.0
 
#include <iostream>
 
void foo(int (&arr)[10])
{}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int arr[10];
    int arr2[1];
    
    foo(arr);
    //foo(arr2); //invalid initialization of reference of type ‘int (&)[10]’ from expression of type ‘int [1]’
}
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 12:00 24
Цитата Сообщение от Renji Посмотреть сообщение
а в серьезных библиотеках
не показательно.
если глянуть потроха какого нибудь MFC,
то там немерянно элементов "UB"
однако, MFC пилят грубо говоря те же люди,
что и компилятор вижуал студии.
они свой компилятор знают.

а вот для пользователя - это все прозрачно.
завтра они выпустят новый компиль,
и обновят MFC.
и для пользователей это все так же останеццо прозрачно.

а вот в пользовательском коде, кто умыдрился заложиццо на UB-конструкцию,
те лососнут тунца.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 14:07 25
Цитата Сообщение от GbaLog- Посмотреть сообщение
Я про то, что скорость доступа на порядок ниже, чем у вектора
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <algorithm>
#include <ctime>
#include <deque>
#include <iostream>
#include <vector>
 
using std::cout;
using std::endl;
using std::cin;
 
const unsigned long NUM_OF_ITERATIONS = 100000;
 
void dequeTest(std::deque<int>& values)
{
    for (unsigned long iter = 0; iter < NUM_OF_ITERATIONS; iter++) {
        int sum = 0;
        for (unsigned long i = 0, size = values.size(); i < size; i += 3) {
            sum += values[i];
        }
    }
}
void vectorTest(std::vector<int>& values)
{
    for (unsigned long iter = 0; iter < NUM_OF_ITERATIONS; iter++) {
        int sum = 0;
        for (unsigned long i = 0, size = values.size(); i < size; i += 3) {
            sum += values[i];
        }
    }
}
 
int main()
{
    auto init = { 1234123, -1, 2134, 45, 5 };
    std::vector<int> vec;
    std::deque<int> deq;
 
    for (int i = 0; i < 1000; i++) {
        for (auto val : init) {
            vec.push_back(val);
            deq.push_back(val);
        }
    }
 
    clock_t start_time, end_time;
 
    start_time = clock();
    dequeTest(deq);
    end_time = clock();
    cout << "t1 = " << (end_time - start_time) << endl;
 
    start_time = clock();
    vectorTest(vec);
    end_time = clock();
    cout << "t2 = " << (end_time - start_time) << endl;
 
    return 0;
}
не самый лучший бенчмарк, но тем не менее показывает разницу
0
Akello2
31.03.2017, 14:15
  #26

Не по теме:

dimcoder,

Цитата Сообщение от dimcoder Посмотреть сообщение
хотите что бы он за вас пересчитал сколько в день нужно читать?
77+-

0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.03.2017, 14:15 27
Цитата Сообщение от DevAlone Посмотреть сообщение
не самый лучший бенчмарк
ага.
Код
t1 = 0
t2 = 0
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 14:16 28
Цитата Сообщение от DevAlone Посмотреть сообщение
не самый лучший бенчмарк, но тем не менее показывает разницу
регекстер показывает либо по нулям)
либо вектор даже медленее)

http://rextester.com/ENHHU26226

а вообще, вы шум в проводах таким макаром тестируете,
и как память грееццо.
а не время доступа.
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.03.2017, 14:18 29
впрочем, это очевидно, ведь vector - массив и там индексация определяется смещением, которая делается в одно действие, в случае же с деком надо сделать несколько.
но! важна ведь не скорость, а сложность. а сложность у обоих константная.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 14:20 30
ну, у меня в ubuntu всё работает

Добавлено через 40 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
а вообще, вы шум в проводах таким макаром тестируете,
и как память грееццо.
а не время доступа.
А как правильно померять только время доступа?

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
впрочем, это очевидно, ведь vector - массив и там индексация определяется смещением, которая делается в одно действие, в случае же с деком надо сделать несколько.
но! важна ведь не скорость, а сложность. а сложность у обоих константная.
Ну, для некоторых алгоритмов и скорость важна, если мы не добавляем часто элементы, то зачем платить за это?
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 14:28 31
Цитата Сообщение от DevAlone Посмотреть сообщение
А как правильно померять только время доступа?
бенчмарк делается на примере какой то более менее реалестичной задачи.
где в обоих случаях используется 1 и тот же алгоритм,
и все формальное различие например только в реализации оператора доступа.

кроме того, секундомер нужно использовать с высоким расширением.
(std::chrono::high_resolution_clock)
тестов должно быть очень много.
время исполнения - ну хотя бы минимум секунд 8-10
брать только средний результат.
крайние пограничные не учитывать вообще.

не лишним будет симуляция фрагментации памяти.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.03.2017, 14:44 32
Цитата Сообщение от GbaLog- Посмотреть сообщение
http://rextester.com/XAHEXE3943
Без ампестанда все скомпилируется. А так да, извернуться при желании можно.
Цитата Сообщение от hoggy Посмотреть сообщение
не показательно.
если глянуть потроха какого нибудь MFC,
то там немерянно элементов "UB"
Вышеупомянутый SYMBOL_INFO используется не в потрохах MFC, а в кастомных реализациях stack backtrace (нужно чтоб переводить 0x12345678 в читаемые имена функций). И если MFC при обновлении компилятора перепишут, то вот пользовательскую функцию для отображения стека вызовов - вряд ли.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 15:04 33
Что-то такое?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <algorithm>
#include <chrono>
#include <ctime>
#include <deque>
#include <iostream>
#include <vector>
 
using std::cout;
using std::endl;
using std::cin;
 
const unsigned long NUM_OF_ITERATIONS = 100;
 
void dequeTest(std::deque<int>& values)
{
    for (unsigned long iter = 0; iter < 1000; iter++) {
        int val = 0;
        for (unsigned long i = 0, size = values.size(); i < size; i += 3) {
            val = values[i];
        }
    }
}
void vectorTest(std::vector<int>& values)
{
    for (unsigned long iter = 0; iter < 1000; iter++) {
        int val = 0;
        for (unsigned long i = 0, size = values.size(); i < size; i += 3) {
            val = values[i];
        }
    }
}
 
int main()
{
    auto init = { 1234123, -1, 2134, 45, 5 };
    std::vector<int> vec;
    std::deque<int> deq;
 
    for (int i = 0; i < 1000; i++) {
        for (auto val : init) {
            vec.push_back(val);
            deq.push_back(val);
        }
    }
 
    std::chrono::time_point<std::chrono::high_resolution_clock> start_time, end_time;
 
    long time1 = 0;
    for (unsigned long i = 0; i < NUM_OF_ITERATIONS; i++) {
        start_time = std::chrono::high_resolution_clock::now();
        dequeTest(deq);
        end_time = std::chrono::high_resolution_clock::now();
        long elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time).count();
 
        if (i > 10 && i < NUM_OF_ITERATIONS - 10) {
            time1 += elapsed / double(NUM_OF_ITERATIONS - 20);
        }
    }
 
    int time2 = 0;
    for (unsigned long i = 0; i < NUM_OF_ITERATIONS; i++) {
        start_time = std::chrono::high_resolution_clock::now();
        vectorTest(vec);
        end_time = std::chrono::high_resolution_clock::now();
        long elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time).count();
 
        if (i > 10 && i < NUM_OF_ITERATIONS - 10) {
            time2 += elapsed / double(NUM_OF_ITERATIONS - 20);
        }
    }
 
    cout << "t1 = " << time1 << endl;
    cout << "t2 = " << time2 << endl;
 
    return 0;
}
разброс между включениями +-5 миллисекунд
t1 = 196919
t2 = 8777

t1 = 201327
t2 = 8831

t1 = 196655
t2 = 8695
Добавлено через 6 минут
и да, там
C++
1
double time1;
и
C++
1
double time2;
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 15:10 34
Цитата Сообщение от DevAlone Посмотреть сообщение
разброс между включениями +-5 миллисекунд
вы там дебаг что ли тестите?))

регестер по прежнему показывает время выполнения - 0 у обоих вариантов.
похоже компиль тупо оптимизировал оба цикла))
повыкидывав все лишнее)
похоже что лишнем оказалось практически все))
ну эт конечно ассм смотреть нужно.

да кстати, важное замечание к бенчмарку:

результаты могут разниццо в зависимости от того,
кто тестируется первым.

например, была такая темка,
когда:
первым засекаем сырые укзаатели - они медленнее
а если смартпоинтер - смарты медленнее.

Кликните здесь для просмотра всего текста
тему можно загуглить по названию:
std::shared_ptr БЫСТРЕЕ обыкновенного указателя?

это эффект "прогретой памяти".

что бы устранить эффект "гретой памяти",
то для теста двух вариантов делают
два разных приложения.

либо случайным образом чередуют оба варианта.
но тогда подсчет времени немножко сложнее реализуется.
1
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 15:21 35
Цитата Сообщение от hoggy Посмотреть сообщение
вы там дебаг что ли тестите?))
нет
Bash
1
g++ -std=c++11 main.cpp && ./a.out
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.03.2017, 15:23 36
Цитата Сообщение от DevAlone Посмотреть сообщение
нет
откройте для себя волшебные ключики оптимизации:
http://itpool.ru/blog/kompilya... ast-2.html
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
31.03.2017, 15:50 37
Цитата Сообщение от hoggy Посмотреть сообщение
откройте для себя волшебные ключики оптимизации:
Bash
1
g++ -std=c++11 main.cpp -O0 && ./a.out
работает
Bash
1
g++ -std=c++11 main.cpp -O1 && ./a.out
t1 = 0
t2 = 0
C++
1
2
3
4
int val = 0;
for (unsigned long i = 0, size = values.size(); i < size; i += 3) {
    val = values[i];
}
Тело цикла без оптимизаций выглядит так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
.L15:
        mov     rax, QWORD PTR [rbp-16]
        cmp     rax, QWORD PTR [rbp-8]
        jnb     .L14
        mov     rdx, QWORD PTR [rbp-16]
        mov     rax, QWORD PTR [rbp-40]
        mov     rsi, rdx
        mov     rdi, rax
        call    _ZNSt5dequeIiSaIiEEixEm
        mov     eax, DWORD PTR [rax]
        mov     DWORD PTR [rbp-28], eax
        add     QWORD PTR [rbp-16], 3
        jmp     .L15
С оптимизациями так:
Assembler
1
2
3
4
.L3:
        add     rax, 3
        cmp     rax, rdx
        jb      .L3
Какой-то компилятор слишком умный стал)

Добавлено через 10 минут
На -O4 он похоже всю функцию вырезает
0
S_el
31.03.2017, 16:01     Как быстро обучиться работать с C++?
  #38

Не по теме:

Цитата Сообщение от Роман Середин Посмотреть сообщение
байт, ты украинец?
А какая разница?

0
31.03.2017, 16:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2017, 16:01
Помогаю со студенческими работами здесь

Как быстро работать с большими текстовыми файлами?
моя цель: есть текстовой файл весом 4 мб все строчки которые начинаются с v переписать в другой...

Как быстро (за 2 недели) научиться работать с формами и графикой на C#?
1 курс,С# успели дать только самые азы, и то не во все эти азы вникла. О формах только-только...

Как обучиться самоорганизации?
Чтобы не ходить на некоторые пары в вузе, а заставить себя самостоятельно заниматься)

Как обучиться программированию?
Всем привет! Кто может научить, все обьяснить по С++. Хочу выучить, помогите. Откликнитесь...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru