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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.79
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
01.01.2011, 15:16     Стандарты и стили языков программирования #1
Занимаясь программирование, например С++, иногда задумываешься, читая различную литературу и разбирая чужие коды программ, что большинство программистов, как начинающих, так и уже вполне опытных, смешивают два разных языка С и С++ (одним языком их никак не назовешь, даже в самом начале изучения). Причем и в университетах (имею ввиду свой) существует дисциплина ЯП С/C++, в которых с самого начала обучения студентов учат программировать на этих двух языках вместе, типа "выбери сам, что ты хочешь". Ведь это не есть хорошо... Получается "адская смесь" - это уже начало раздражать. Да и на форуме, процентов 80%, таких людей хватает... Даже можно привести пример, когда чел на форуме пишет какой-нить код на Си, он выделяет его как код Си++. Потом начинаешь читать, и как-то не хорошо становится - и это самая мелочь!!! =)
Как Вы относитесь к такой проблеме?!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.01.2011, 16:42     Стандарты и стили языков программирования #21
accept, Насчет вставки. То есть это неудобно? Вставка тут - только две строчки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::vector<int> Vec((std::istream_iterator<int>(std::cin)),
        std::istream_iterator<int>());
    std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::vector<int>::iterator middle=Vec.end()-Vec.size()/2;
    Vec.insert(middle, 100);
    std::cout<<'\n';
    std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
По поводу байтов... И где отличие?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <iostream>
 
int main()
{
    std::string str;
    str.push_back(0x01);
    str.push_back(0x02);
    str.push_back(0x00);
    str.push_back(0x03);
    std::cout<<str.size()<<'\n';
    std::cout<<str<<'\n';
    char what[5];
    what[0]=0x01;
    what[1]=0x02;
    what[2]=0x00;
    what[3]=0x03;
    what[4]='\0';
    std::cout<<what<<'\n';
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2011, 07:55     Стандарты и стили языков программирования #22
Цитата Сообщение от rangerx
И что должен был показать этот неправильный пример? )) Что нельзя обращатся по идексу к элементам строки нулевого размера? )
так делать нельзя ? а как надо ? перед обращением проверить размер строки ?
или сначала задать размер строки

Цитата Сообщение от rangerx
1 И в векторе, и в string, аналогично.
2 Смысл?
3 С вектором тоже, и что? И вывести его как строку тоже не составляет особого труда(опять же, смысл?).
4 И с каких пор?
1 в string ещё неизвестно, чем будет строка, если её сделать длинной
а в векторе тем более
2 чтобы он память не занимал
когда работаешь с байтами, он не нужен
push_back, покажи push_back для заголовка бинарного файла
3 чтобы вывести вектор
C++
1
copy(v.begin(), v.end(), ostream_iterator <int> (cout, " "));
а как вывести его не в виде "1 2 3 ", а в виде " 1 2 3" ?
а это вообще не одно и тоже, что
C++
1
for (long i = 0; i < v.size(); i++) cout << v[i] << " ";
?
4 я имел в виду поместить-то можно, только смысла в этом нет, так как методы string завязаны на нуль-символ
с обычными массивами нет этих ограничений, что хочешь, то и помещай туда

здесь коллизии

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
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
 
using namespace std;
 
int main(void)
{
    vector <int> v; // так не выходит (1, 2, 3, 4);
    
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    
    copy(v.begin(), v.end(), ostream_iterator <int> (cout, " "));
    cout << endl; //а как её в одну строку
 
    string s("abcde");
    char arr[] = { 'a', 'b', 'c', 'd', 'e' };
    
    cout << sizeof s + sizeof "abcde" << endl; // это не полная картина
    cout << sizeof arr << endl; // это фактически
    cout << s.size() << endl; // это для информации просто
    
    return 0;
}

и это ещё кратенько написано
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.01.2011, 15:18     Стандарты и стили языков программирования #23
accept, Задать или использовать push_back.
1 в string ещё неизвестно, чем будет строка, если её сделать длинной
а в векторе тем более
Не понял, что имеется ввиду.

а как вывести его не в виде "1 2 3 ", а в виде " 1 2 3" ?
n-ое кол-во вариантов.
C++
1
2
3
4
5
for(std::vector<int>::const_iterator iter=vec.begin(); iter != vec.end(); ++iter)
{
     std::cout<<' '<<*iter;
}
std::cout<<'\n';
C++
1
2
3
4
5
6
7
void print(int one)
{
    std::cout<<' '<<one;
}
 
std::for_each(vec.begin(), vec.end(), print);
std::cout<<'\n';
C++
1
std::for_each(vec.begin(), vec.end(), [](int el) {std::cout<<' '<<el;});
и т.д.

Добавлено через 42 секунды
4 я имел в виду поместить-то можно, только смысла в этом нет, так как методы string завязаны на нуль-символ
с обычными массивами нет этих ограничений, что хочешь, то и помещай туда
Тоже не понял что ты имеешь ввиду
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.01.2011, 21:47     Стандарты и стили языков программирования #24
Цитата Сообщение от accept Посмотреть сообщение
1 в string ещё неизвестно, чем будет строка, если её сделать длинной
а в векторе тем более
Не понял, что ты имеешь в виду. Подробнее.
Цитата Сообщение от accept Посмотреть сообщение
2 чтобы он память не занимал
когда работаешь с байтами, он не нужен
Cкажу одно, не следует использовать std::string не по назначению, пусть строка остаётся строкой
Цитата Сообщение от accept Посмотреть сообщение
покажи push_back для заголовка бинарного файла
Почему обязательно push_back? С вектором можно работать точно также как и с обычным массивом.
Цитата Сообщение от accept Посмотреть сообщение
C++
1
vector <int> v; // так не выходит (1, 2, 3, 4);
С выходом нового Стандарта C++ инициализировать контейнеры можно будет аналогично массивам. Но пока этого сделать нельзя(ну, почти нельзя) это недостаток, согласен.
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
copy(v.begin(), v.end(), ostream_iterator <int> (cout, " "));
cout << endl; //а как её в одну строку
А с массивами это как-то по-другому будет выглядет?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
06.01.2011, 22:35     Стандарты и стили языков программирования #25
Не вижу проблемы в перемешивании Си и Си++ до тех пор, пока это не выходит на уровень маразма, типа того, что в половине кода используется malloc/free, а в другой половине - new/delete. Хотя в данной теме речь идёт в первую очередь о перемешивании библиотек стандартной поддержки, а не о использовании языка

Вот пример конструкции, который в принципе не пишется на "чистом Си++" cin cout и fscan fprintf. Другой пример - realloc (авторы Си++ как-то не подумали о подобной конструкции).

Цитата Сообщение от Mиxaил Посмотреть сообщение
Могу привести еще один пример. Есть такой сайт codepad.org, в котором можно компилировать код и получать результат, так вот, если попытаться скомпилить на с++ самый простой код си, то он выкинет ошибку, так как в этот компилятор, я так понимаю, встроены читстые языки... Попробуйте!
Ты немного путаешь горячее с холодным. Стандарт Си слишком фривольный, а стандарт Си++ - более строгий (а потому ругается на безолаберные конструкции, которые позволяет Си). "Выкинет ошибку", о чём ты говоришь, может относиться только к этому. Там используется компилятор GCC, а потому всё пережуёт нормально

Добавлено через 23 минуты
Вот ещё. При перемешивании кодов на Си и Си++ нужно помнить, что есть конструкции, которые по разному трактуются в Си и Си++

Задачи для тренировки и лучшего понимания
Задачи для тренировки и лучшего понимания
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.01.2011, 05:01     Стандарты и стили языков программирования #26
Цитата Сообщение от rangerx
Не понял, что ты имеешь в виду. Подробнее.
string
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
using namespace std;
 
int main(void)
{
    string s;
    size_t n;
    
    n = 0;
    while (1) {
        s += "a";
        if (++n % 100000 == 0)
            cout << n << endl;
    }
    cout << s << endl;
    
    return 0;
}
Код
1073700000
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Аварийный останов

что находится в s и как оно хранится в памяти ?
если обращаться к элементам в s по индексам, то индексы будут по-порядку, но индексы - это не память

Цитата Сообщение от rangerx
С вектором можно работать точно также как и с обычным массивом.
к обычному массиву можно применить memove(), а к вектору ?
как он хранится в памяти ? слитно ?
он не должен слитно храниться, это ещё строка может быть там хранится слитно, хотя тоже не факт, что при увеличении она не будет в виде фрагментов, а вектор, там вроде можно ещё промежутки оставлять, удаляя элементы

Цитата Сообщение от ForEveR
n-ое кол-во вариантов.
то есть, чтобы просто поменять пробел, нужно переделывать блок

C++
1
[](int el) {std::cout<<' '<<el;}
это что-то вроде lambda ?
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
07.01.2011, 05:11     Стандарты и стили языков программирования #27
Цитата Сообщение от accept Посмотреть сообщение
а к вектору ? как он хранится в памяти ? слитно ?
Да.

Цитата Сообщение от accept Посмотреть сообщение
он не должен слитно храниться
Должен.

Цитата Сообщение от accept Посмотреть сообщение
хотя тоже не факт, что при увеличении она не будет в виде фрагментов
Факт.

Цитата Сообщение от accept Посмотреть сообщение
а вектор, там вроде можно ещё промежутки оставлять, удаляя элементы
Тебя обманули.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.01.2011, 05:23     Стандарты и стили языков программирования #28
accept, 1) Чтобы в ней не хранилось по данному коду - мы этого не увидим... Зачем писать неверную (в данном случае зацикленную) программу в попытке что-то доказать? Тем более в string ведь можно поместить не бесконечное кол-во символов (как бэ тип size_t у размера контейнера намекает).

2) А зачем к вектору применять memove? Это совершенно другая ступень работы. С обычным массивом - мы работаем с памятью. С вектором - мы работаем с итераторами, которые в данном случае есть удобная обертка указателей. + мы работаем с функциями-членами вроде reserve/push_back/resize etc. Так какой смысл применять к нему memove?

+ отрывок функции которая используется при реализации вектора.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class _Ty1,
    class _Ty2> inline
    _Ty2 _Uninit_copy(_Ty1 _First, _Ty1 _Last, _Ty2 _Dest,
        _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
    {   // copy [_First, _Last) to raw _Dest, scalar type
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Dest);
    size_t _Count = (size_t)(_Last - _First);
    _Ty2 _Result = _Dest + _Count;
    if (_Count > 0)
        _CRT_SECURE_MEMMOVE(&*_Dest,
            _Count * sizeof (*_First), &*_First,
            _Count * sizeof (*_First)); // NB: non-overlapping move
    return (_Result);
    }
Функция находится в заголовочном файле memory.
Впринципе в векторе (и в остальных контейнерах) даже нет напрямую работы с памятью в реализации. Ведь как распределитель используется аллокатор (что есть тоже обертка для более удобного распределения памяти, чего в массивах нету).

А теперь - полная иерархия реализации конструктора копирования для вектора.

C++
1
2
3
4
5
6
7
8
9
10
11
    vector(const _Myt& _Right)
        : _Mybase(_Right._Alval)
        {   // construct by copying _Right
        if (_Buy(_Right.size()))
            _TRY_BEGIN
            _Mylast = _Ucopy(_Right.begin(), _Right.end(), _Myfirst);
            _CATCH_ALL
            _Tidy();
            _RERAISE;
            _CATCH_END
        }
C++
1
2
3
4
5
6
    template<class _Iter>
        pointer _Ucopy(_Iter _First, _Iter _Last, pointer _Ptr)
        {   // copy initializing [_First, _Last), using allocator
        return (_STDEXT unchecked_uninitialized_copy(_First, _Last,
            _Ptr, this->_Alval));
        }
C++
1
2
3
4
5
6
7
8
9
10
template<class _InIt,
    class _FwdIt> inline
    _FwdIt unchecked_uninitialized_copy(_InIt _First, _InIt _Last,
        _FwdIt _Dest)
    {   // copy [_First, _Last) to raw _Dest
        return (_STD _Uninit_copy(_CHECKED_BASE(_First),
            _CHECKED_BASE(_Last), _Dest,
            _STD _Ptr_cat(_First, _Dest),
            _STD _Range_checked_iterator_tag()));
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class _Ty1,
    class _Ty2> inline
    _Ty2 _Uninit_copy(_Ty1 _First, _Ty1 _Last, _Ty2 _Dest,
        _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
    {   // copy [_First, _Last) to raw _Dest, scalar type
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Dest);
    size_t _Count = (size_t)(_Last - _First);
    _Ty2 _Result = _Dest + _Count;
    if (_Count > 0)
        _CRT_SECURE_MEMMOVE(&*_Dest,
            _Count * sizeof (*_First), &*_First,
            _Count * sizeof (*_First)); // NB: non-overlapping move
    return (_Result);
    }
C++
1
#define _CRT_SECURE_MEMMOVE(dest, destsize, source, count) ::memmove_s((dest), (destsize), (source), (count))
Оп как.

Добавлено через 5 минут
accept,
то есть, чтобы просто поменять пробел, нужно переделывать блок

C++
1
[](int el) {std::cout<<' '<<el;}
это что-то вроде lambda ?
Почему же вроде? Это и есть лямбда-функция. С++0x
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
07.01.2011, 05:24     Стандарты и стили языков программирования #29
Цитата Сообщение от accept Посмотреть сообщение
к обычному массиву можно применить memove(), а к вектору ??
Не нужен.

C++
1
2
3
4
5
6
7
8
9
// Создаём вектор.
std::vector<int> vec1;
    
// Заполняем его чем-нить.
for (int i = 0; i < 10; i++)
    vec1.push_back(i);
 
// Копируем в другой вектор, исключая крайние элементы.
std::vector<int> vec2(vec1.begin() + 1, vec1.end() - 1);
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.01.2011, 06:07     Стандарты и стили языков программирования #30
Цитата Сообщение от NightmareZ
хотя тоже не факт, что при увеличении она не будет в виде фрагментов
Факт.
откуда следует сей факт ?

Цитата Сообщение от ForEveR
А зачем к вектору применять memove?
чтобы не тратить время на там вызовы, создание чего-нибудь ещё и так далее
memove() создаёт буфер, чтобы перекрывающиеся фрагменты правильно копировались, и всё

_CRT_SECURE_MEMMOVE
то есть к вектору применяется memove(), из чего следует, что он хранится слитно

хранится ли он слитно во всех компиляторах ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
4838 / 3237 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.01.2011, 00:23     Стандарты и стили языков программирования #36
Цитата Сообщение от accept Посмотреть сообщение
когда из вектора нужно удалить элементы не с начала и не с конца, memmove() там явно не применима, даже если вектор хранит элементы слитно, потому что нужно менять переменные, отвечающие за его длину и так далее
Использовать memmove для вектора уже маразм. То есть это конечно возможно сделать, да. Но можно и щи вилкой хлебать.
Все, что гарантирует стандарт так это последовательное хранение элементов, как в обычном массиве, следовательно обращаться к элементам можно, как к элементам массива. Но это не значит, что можно тасовать области памяти, как душе угодно.

По поводу споров о векторах и массивах, мое мнение такое, там где можно использовать массив статического размера, пусть будут именно такие массивы, где требуется динамическое распределение памяти, лучше использовать вектор.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.01.2011, 00:25     Стандарты и стили языков программирования #37
fasked, memmove используется в самом векторе. см. выше.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.01.2011, 00:29     Стандарты и стили языков программирования #38
Цитата Сообщение от ForEveR Посмотреть сообщение
memmove используется в самом векторе. см. выше.
а я с этим и не спорил. memmove используется в методе класса вектор. я же говорю о применении memmove к объекту вектора.
accept
08.01.2011, 08:39
  #39

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 14:02     Стандарты и стили языков программирования
Еще ссылки по теме:

С++ 4 и 5 поколение языков программирования C++
Посоветуйте литературу "Синтаксис и семантика языков программирования С/С++ и Паскаль" C++
Оформление кода на С++ (стандарты кодирования) C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.01.2011, 14:02     Стандарты и стили языков программирования #40
accept, э. Стандарт С++ набери в яндексе/гугле
Первая же ссылка - ссыль на форум - первое же сообщение ссыль на стандарт
Yandex
Объявления
08.01.2011, 14:02     Стандарты и стили языков программирования
Ответ Создать тему
Опции темы

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