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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.79
Mиxaил
533 / 438 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
#1

Стандарты и стили языков программирования - C++

01.01.2011, 15:16. Просмотров 4405. Ответов 41
Метки нет (Все метки)

Занимаясь программирование, например С++, иногда задумываешься, читая различную литературу и разбирая чужие коды программ, что большинство программистов, как начинающих, так и уже вполне опытных, смешивают два разных языка С и С++ (одним языком их никак не назовешь, даже в самом начале изучения). Причем и в университетах (имею ввиду свой) существует дисциплина ЯП С/C++, в которых с самого начала обучения студентов учат программировать на этих двух языках вместе, типа "выбери сам, что ты хочешь". Ведь это не есть хорошо... Получается "адская смесь" - это уже начало раздражать. Да и на форуме, процентов 80%, таких людей хватает... Даже можно привести пример, когда чел на форуме пишет какой-нить код на Си, он выделяет его как код Си++. Потом начинаешь читать, и как-то не хорошо становится - и это самая мелочь!!! =)
Как Вы относитесь к такой проблеме?!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2011, 15:16     Стандарты и стили языков программирования
Посмотрите здесь:
С++ 4 и 5 поколение языков программирования C++
Чем так отличается язык с++ от других языков программирования C++
Посоветуйте литературу "Синтаксис и семантика языков программирования С/С++ и Паскаль" C++
Дипломная работа "Программа для самостоятельного изучения языков программирования" C++
Устаревшие стандарты C++
Стандарты оформления кода C++
Оформление кода на С++ (стандарты кодирования) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.01.2011, 13:55     Стандарты и стили языков программирования #31
accept, Ну это нужно помсмотреть стандарт... Но я думаю либо это гарантировано либо все зависит от разработчиков

Добавлено через 13 минут
Вообщем в стандарте про вектор есть. Страница 482 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

Но вот то, что он хранится в памяти подряд - гарантируют итераторы я так понимаю. Иначе невозможно было бы переместить итератор с одного элемент на другой (все же итератор в векторе - обертка над указателем).
Evg
07.01.2011, 14:10
  #32

Не по теме:

Цитата Сообщение от accept Посмотреть сообщение
memove() создаёт буфер, чтобы перекрывающиеся фрагменты правильно копировались, и всё
Чтобы перекрывающиеся фрагменты правильно копировались достаточно их копировать либо в прямом, либо в обратном порядке (в зависимости от того, каким концом они перекрываются). Никаких буфферов не надо

accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.01.2011, 14:25     Стандарты и стили языков программирования #33
C89 memmove

4.11.2.2 The memmove function

Synopsis

#include <string.h>
void *memmove(void *s1, const void *s2, size_t n);

Description

The memmove function copies n characters from the object pointed to
by s2 into the object pointed to by s1 . Copying takes place as if
the n characters from the object pointed to by s2 are first copied
into a temporary array of n characters that does not overlap the
objects pointed to by s1 and s2 , and then the n characters from the
temporary array are copied into the object pointed to by s1 .

Returns

The memmove function returns the value of s1 .

там есть ещё memcpy(), вот она для неперекрывающихся

Цитата Сообщение от ForEveR
Но вот то, что он хранится в памяти подряд - гарантируют итераторы я так понимаю.
ещё неясный вопрос остался
когда из вектора нужно удалить элементы не с начала и не с конца, memmove() там явно не применима, даже если вектор хранит элементы слитно, потому что нужно менять переменные, отвечающие за его длину и так далее

Не по теме:


Страница 482
скорость сегодня 300б/с

Evg
07.01.2011, 14:32
  #34

Не по теме:

accept, вот один из вариантов реализации memmove: http://www.student.cs.uwaterloo.ca/~...8c-source.html
Ветка обратного копирования разделена на два варианта для скорости: в одной копирование идёт long'ами, в другой - char'ами

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.01.2011, 00:04     Стандарты и стили языков программирования #35
accept, Надо просто посмотреть на реализацию erase. Когда я сам писал вектор - я удалял элементы через

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                iterator erase(iterator Where)
                {
                        if(Where==end())
                                return Where;
                        Alloc.destroy(&(*Where));
                        stdext::unchecked_copy(Where+1, end(), Where);
                        --Size;
                        return Where;
                }
 
                iterator erase(iterator first, iterator last)
                {
                        if(first==last)
                                return end();
                        iterator ptr=stdext::unchecked_copy(last, end(), begin());
                        last=ptr;
                        Size-=last-first;
                        return first;
                }
unchecked copy сейчас посмотреть не могу. Вечером скину его реализацию в MSVS

Добавлено через 5 часов 34 минуты
Вот erase векторовский.

C++
1
2
3
4
5
6
7
8
9
10
11
    iterator erase(const_iterator _Where)
        {   // erase element at where
        if (_Where._Mycont != this
            || _Where._Myptr < _Myfirst || _Mylast <= _Where._Myptr)
            _DEBUG_ERROR("vector erase iterator outside range");
        _STDEXT unchecked_copy(_Where._Myptr + 1, _Mylast, _Where._Myptr);
        _Destroy(_Mylast - 1, _Mylast);
        _Orphan_range(_Where._Myptr, _Mylast);
        --_Mylast;
        return (iterator(_Where._Myptr, this));
        }
C++
1
2
3
4
5
6
7
template<class _InIt,
    class _OutIt> inline
    _OutIt __CLRCALL_OR_CDECL unchecked_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
    {   // copy [_First, _Last) to [_Dest, ...)
        return (_STD _Copy_opt(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest,
            _STD _Iter_random(_First, _Dest), _STD _Ptr_cat(_First, _Dest), _STD _Range_checked_iterator_tag()));
    }
C++
1
2
3
4
5
6
7
8
9
10
template<class _InIt, class _OutIt, class _InOutItCat>
inline
    _OutIt __CLRCALL_OR_CDECL _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
        _InOutItCat, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
    {   // copy [_First, _Last) to [_Dest, ...), arbitrary iterators
    _DEBUG_RANGE(_First, _Last);
    for (; _First != _Last; ++_Dest, ++_First)
        *_Dest = *_First;
    return (_Dest);
    }
C++
1
2
3
4
    void _Destroy(pointer _First, pointer _Last)
        {   // destroy [_First, _Last) using allocator
        _Destroy_range(_First, _Last, this->_Alval);
        }
C++
1
2
3
4
5
6
template<class _Alloc> inline
    void _Destroy_range(typename _Alloc::pointer _First,
        typename _Alloc::pointer _Last, _Alloc& _Al,
        _Scalar_ptr_iterator_tag)
    {   // destroy [_First, _Last), scalar type (do nothing)
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    void _Orphan_range(pointer _First, pointer _Last) const
        {   // orphan iterators within specified (inclusive) range
        _Lockit _Lock(_LOCK_DEBUG);
        const_iterator **_Pnext = (const_iterator **)&this->_Myfirstiter;
        while (*_Pnext != 0)
            if ((*_Pnext)->_Myptr < _First || _Last < (*_Pnext)->_Myptr)
                _Pnext = (const_iterator **)&(*_Pnext)->_Mynextiter;
            else
                {   // orphan the iterator
                (*_Pnext)->_Mycont = 0;
                *_Pnext = (const_iterator *)(*_Pnext)->_Mynextiter;
                }
        }
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.01.2011, 00:23     Стандарты и стили языков программирования #36
Цитата Сообщение от accept Посмотреть сообщение
когда из вектора нужно удалить элементы не с начала и не с конца, memmove() там явно не применима, даже если вектор хранит элементы слитно, потому что нужно менять переменные, отвечающие за его длину и так далее
Использовать memmove для вектора уже маразм. То есть это конечно возможно сделать, да. Но можно и щи вилкой хлебать.
Все, что гарантирует стандарт так это последовательное хранение элементов, как в обычном массиве, следовательно обращаться к элементам можно, как к элементам массива. Но это не значит, что можно тасовать области памяти, как душе угодно.

По поводу споров о векторах и массивах, мое мнение такое, там где можно использовать массив статического размера, пусть будут именно такие массивы, где требуется динамическое распределение памяти, лучше использовать вектор.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.01.2011, 00:25     Стандарты и стили языков программирования #37
fasked, memmove используется в самом векторе. см. выше.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.01.2011, 00:29     Стандарты и стили языков программирования #38
Цитата Сообщение от ForEveR Посмотреть сообщение
memmove используется в самом векторе. см. выше.
а я с этим и не спорил. memmove используется в методе класса вектор. я же говорю о применении memmove к объекту вектора.
accept
08.01.2011, 08:39
  #39

Не по теме:

скорость сегодня 300б/с
это короче сайт, стандарт стыренный ?
нигде в нете ссылки на американцев не видно

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.01.2011, 14:02     Стандарты и стили языков программирования #40
accept, э. Стандарт С++ набери в яндексе/гугле
Первая же ссылка - ссыль на форум - первое же сообщение ссыль на стандарт
accept
09.01.2011, 06:30
  #41

Не по теме:

все ссылки ведут на кузбас
с++ 98
вроде черновик, а вход по паролю
центр
этот-то у меня есть, но он на 11 метров

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2011, 10:01     Стандарты и стили языков программирования
Еще ссылки по теме:
C++ Объясните небольшой фрагмент кода (новые стандарты)
Программа по изучению языков C++
Программа помогающая в изучении иностранных языков в С++ C++
Сколько языков Cи есть?Какие у каждого особенности? C++
C++ Каким образом компилировать код не си-подобных языков?

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.01.2011, 10:01     Стандарты и стили языков программирования #42
accept, 11-метровый понравился.
Yandex
Объявления
09.01.2011, 10:01     Стандарты и стили языков программирования
Ответ Создать тему
Опции темы

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