powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массив
25 сообщений из 61, страница 2 из 3
Динамический массив
    #34355282
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Вы не привели ни одного аргумента, а лишь свое личное мнение. В каком направлении вы хотите продолжить беседу? А что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами.
...
Рейтинг: 0 / 0
Динамический массив
    #34355334
Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по STL: Николая Джосьютиса " Стандартная библиотека C++ "

Николай Джосьютис
Векторы как обычные массивы
В спецификации стандартной библиотеки C++ не сказано, что элементы вектора должны храниться в непрерывном блоке памяти. Тем не менее подразумевалось, что такая реализация гарантирована, а соответствующие изменения будут внесены в спецификацию. Следовательно, для любого действительного индекса i в векторе v заведомо истинно следующее условие:
&v == &v[0] + i
Из гарантированного выполнения этого условия следует один важный факт: вектор может задействоваться во всех случаях, когда в программе используется динамический массив. Например, в векторе можно хранить данные обычных строк С типа char* или const char*:
std: :vector<char> v: // Создание вектора как динамического массива типа char
v.resize(41); // Выделить память для 41 символа (включая \0)
strcpy(Sv[0]. "hello, world"): // Копирование строки С в вектор
printf("£s\n", &v[0]): // Вывод содержимого вектора в виде строки С
...
Рейтинг: 0 / 0
Динамический массив
    #34355344
что-то эта строка выше полохо пропечаталась, исправил:
&v == &v[0] + i
...
Рейтинг: 0 / 0
Динамический массив
    #34355359
нифига себе квадратные скобки не воспринимает( [] внутри i ), думает что я курсивом писать хочу. попробую так
Код: plaintext
1.
&v[j] == &v[ 0 ] + j;
...
Рейтинг: 0 / 0
Динамический массив
    #34355380
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковВы не привели ни одного аргумента, а лишь свое личное мнение.

Ложь

Анатолий ШироковА что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами.

Провокация.
...
Рейтинг: 0 / 0
Динамический массив
    #34355451
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы еще подеритесь!
А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому
...
Рейтинг: 0 / 0
Динамический массив
    #34355494
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местный писатель_Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по STL: Николая Джосьютиса " Стандартная библиотека C++ "

Николай Джосьютис
Векторы как обычные массивы
В спецификации стандартной библиотеки C++ не сказано, что элементы вектора должны храниться в непрерывном блоке памяти. Тем не менее подразумевалось, что такая реализация гарантирована, а соответствующие изменения будут внесены в спецификацию. Следовательно, для любого действительного индекса i в векторе v заведомо истинно следующее условие:
&v == &v[0] + i
Из гарантированного выполнения этого условия следует один важный факт: вектор может задействоваться во всех случаях, когда в программе используется динамический массив. Например, в векторе можно хранить данные обычных строк С типа char* или const char*:
std: :vector<char> v: // Создание вектора как динамического массива типа char
v.resize(41); // Выделить память для 41 символа (включая \0)
strcpy(Sv[0]. "hello, world"): // Копирование строки С в вектор
printf("£s\n", &v[0]): // Вывод содержимого вектора в виде строки С


В электронном виде гдето еть?
Можно ссылку.

Пока я ожидаю новый стандарт( не получил еще) немного пофилосовствую.
Все последующее в этом сообщенни воспринимать как ИМХО.
Без претензии на абсолютную правоту.

Как говрит наш президент

Теза перша:

1. Для каждого шаблона может существовать свой ( непосредственно написанный под него)
Allocator.
Если для строк непрерывное хранение критично то для массивов чисел нет.
У меня давно уже руки чешутся написать алокатор для хранения больших массивов
в разделяемой памяти Unix. Да все руки недоходят.
Я не хочу для добавления одного элемента ганять по памяти сотни мегабайт.

Теза друга:

2. Когдато (сейчас уже не помю где ) кажется у Страуструпа читал, что скорость вставки
в вектор соответствует закону logN ( N количество элементов).
Вы можете представить себе реалокацию массива обьемом в 1 Гб ?
Если есть требования стандарта на непрерывное хранине значит должно быть
описание как быть с памятью во время копирования.
Те кто повелся на рекламу об относительно малой разницы в скорости между
вектором и массивом будут сильно разочарованы.


Теза третя:
Я бы на месте стандартизаторов никода бы на абсолютную непрервность не завязывался,
а лучше рассмотрел возможность предоставить виртуально непреревное простраство с точки зрения доступа к обьектам класса и описал соответсвующие механизмы
(которые частично уже есть).

Кстате по поводу

Код: plaintext
1.
&v[j] == &v[ 0 ] + j;

Этот результат может быть получен в результате
Код: plaintext
1.
operator[]+(int)
Который зделает всю черную работу.
Я бы с большим удовольствием увидел бы такой оператор в стандарте нежели
требование размещать данные строго последовательно.


ИМХО Хранить элементы вектора непрерывно - тупиковый путь .
...
Рейтинг: 0 / 0
Динамический массив
    #34355526
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Опять ниодного аргумента. Одни вопли.
...
Рейтинг: 0 / 0
Динамический массив
    #34355533
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Местный писатель

Джосьютис лишь цитирует стандарт, цитату я приводил ранее.
...
Рейтинг: 0 / 0
Динамический массив
    #34355547
onstat-

В электронном виде гдето еть?
Можно ссылку.



на странице 164 посмотри
...
Рейтинг: 0 / 0
Динамический массив
    #34355559
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковОпять ниодного аргумента. Одни вопли.

Прочти топик.
...
Рейтинг: 0 / 0
Динамический массив
    #34355572
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Я не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще?
...
Рейтинг: 0 / 0
Динамический массив
    #34355582
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНу вы еще подеритесь!
А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому

blinded, осталось дождаться реализации, когда приведет к плохому...

Считаю, что подобное использование не является идеологически верным. Т.к. есть специальный интерфейс, который предоствляет доступ к определенным элементам контейнера, а не ко всему контейнеру в целом. Так как область применения контейнера не влючает использование его элементов в целом, то использование не по назначению, не может являться корректным.
...
Рейтинг: 0 / 0
Динамический массив
    #34355597
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где криминал

авторint foo(boo array[], size_t size)
{
...
}

...

std::vector<boo> array(10);
foo(&array[0], array.size());

?
...
Рейтинг: 0 / 0
Динамический массив
    #34355599
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще?

Уже не буду спрашивать "где ваши аргументы" по этому конкретному вопросу.

Дырки - это только одно из предположений. Прочтите ответ к blinded.

ПС:
Вопрос не по теме: вы специально делаете наивный вид, что не понимаете мои высказываения, преследуя определенную целью, или просто не внимательно читаете? Вопрос относится не только к этому ответу, а практически ко всем в этом топике.
...
Рейтинг: 0 / 0
Динамический массив
    #34355640
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно?

По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент.
...
Рейтинг: 0 / 0
Динамический массив
    #34355653
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковА где криминал?




авторint foo(boo array[], size_t size)
{
.......
memset (&array[0], 0, size); // с обычными мссивами делаю, а с веторами я не рискую.
.......

}




Что будет если где нибудь при сборке попадется не та реализация STL?
И на каком эта бомба взорвется.
...
Рейтинг: 0 / 0
Динамический массив
    #34355666
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно.
...
Рейтинг: 0 / 0
Динамический массив
    #34355709
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЕще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно.

В принципе согласен.

Но есть ИМХО : Но непрерывность памяти это насколько не фундаментальная вещь
что заносить ее в стандарт планформонезависимого языка по крайней мере недальневидно.
Со стандартом я спорить ненамерен, есть много законов которые мне не нравятся, но я вынужден им подчиняться.
...
Рейтинг: 0 / 0
Динамический массив
    #34355733
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаете, разработчки std::vector должны были гарантировать непрерывное размещение, дабы иметь динамический аналог втроенного массива. В противном случае, нам бы пришлось пользоваться небезопасными динамическими массивами в стиле new POINT[] только лишь для того, чтобы передать в WinAPI функцию набор точек и прочее-прочее.
...
Рейтинг: 0 / 0
Динамический массив
    #34355746
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 Akh

Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно?

По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент.

На счет дырок я привел пример возможной реализации.

На счет стандарта я привел цитату Страуструпа. То что она не состыкуется с вашей цитатой, означает что это скользкой вопрос, это и есть те "нюансы" о которых вы написали ниже.

Рассмотрим идеалогию контейнера вектор, как я ее понимаю. Если вы будете в чем-то не согласны - поправляйте, если хотите. Только без личностных нападок (плохое впечатление о вас складывается).

Так вот. Имеем шаблон контейнера, который может содержать объекты. Назовем его вектором и возложим на него требование - максимально быстро пробегать по элементам. Для этого у контейнера есть итератор и интерфейс доступа к элементам. Он выполняет свою функцию, все работает, все прекрасно.

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

В итоге, мы используем, причем успешно, данные контейнера вектор, как массив и все хорошо. Ничего не происходит, т.к. реализации идут параллельно нашим размышлениям.

Но остался не верный вывод. То что очевидно ложить данные друг за другом еще не значит, что они так лежат. Может между ними дырки (допустим, 4 байта интеджер, 2 байта метаданные, и т.д. v[n]=(type of element vector)((char*)(&v[0])+(sizeof(v[0])+C)*n)) или вариант от onstat-а или мало ли чего можно еще надумать. А раз так, значит наш код находится под угрозой, и следавательно он не может считаться корректным.

Надеюсь, понятно изложил, что я считаю в данном случаю идеологией.
...
Рейтинг: 0 / 0
Динамический массив
    #34355821
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я считаю, что вы неверно трактуете термин contiguously из приведенной цитаты
Код: plaintext
1.
2.
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator>
where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for 
all 0 <= n < v.size().
и заменяете его на "друг за другом", хотя истинный смысл его "рядом"

Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как:

Код: plaintext
1.
reference operator[](size_type n);
const_reference operator[](size_type n) const;

возвращает reference, который определен как

Код: plaintext
typedef typename Allocator::reference reference;

который, согласно стандарту, определен как

Код: plaintext
1.
X::reference == T&

Следовательно в приведенной цитате v[0] может означать лишь ссылку на 0 элемент типа T, а v[n] - ссылку на n-ый элемент типа T. Следовательно, sizeof(v ) == sizeof(v[i+1]) == sizeof(T) и значит С в вашем посте всегда будет равно 0:

С = sizeof(v[i+1]) - sizeof(v) = 0

На основе этого можно сделать вывод, что элементы находятся в векторе непрерывно без дырок и там где используются обычные массивы мы в праве использовать и std::vector.
...
Рейтинг: 0 / 0
Динамический массив
    #34355893
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ считаю, что вы неверно трактуете термин contiguously из приведенной цитаты
Код: plaintext
1.
2.
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator>
where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for 
all 0 <= n < v.size().
и заменяете его на "друг за другом", хотя истинный смысл его "рядом"

Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как:

Код: plaintext
1.
reference operator[](size_type n);
const_reference operator[](size_type n) const;

возвращает reference , который определен как

Код: plaintext
typedef typename Allocator::reference reference;

который, согласно стандарту, определен как

Код: plaintext
1.
X::reference == T&

Следовательно в приведенной цитате v[0] может означать лишь ссылку на 0 элемент типа T, а v[n] - ссылку на n-ый элемент типа T. Следовательно, sizeof(v ) == sizeof(v[i+1]) == sizeof(T) и значит С в вашем посте всегда будет равно 0:

С = sizeof(v[i+1]) - sizeof(v) = 0

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



Не буду претендовать а абсолютную правоту, так как не уверен.

Мне кажется я об этом уже писал своими словами.
Тонкое место в ваших рассуждениях выделено.
Возвращает не значит, что попутно не делает никаких преобразований.
Мне очень не нравится слово obeys в контексте рассуждений.
...
Рейтинг: 0 / 0
Динамический массив
    #34356053
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь достаточно того, что какие бы это преобразования ни были верно следующее:

&v[n] = &v[0] + n = ((const char *)&v[0]) + n*sizeof(T);

поскольку именно так определяется оператор + применительно к указателю на тип, где v[0] и v[n] - ссылки на T.
...
Рейтинг: 0 / 0
Динамический массив
    #34356083
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО:
Если не нравится <vector>, то можно:
1) Залезть в исходники и посмотреть как оно работает.
2) Использовать класс типа этого:
Код: plaintext
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.
template <typename T, typename Int = unsigned long>class Vector{
public:
	Int increment;
	Int count;
	Int capacity;
	T* data;

	void grow(void){
		Int newCapacity = increment ? capacity + increment: capacity* 2 ;
		T* newData = new T[newCapacity];
		memcpy(newData, data, sizeof(T)*count);
		delete[] data;
		data = newData;
		capacity = newCapacity;
	}

	void pushBack(const T value){
		if (count == capacity)
			grow();
		data[count++] = value;
	}

	void pushRefBack(const T& value){
		if (count == capacity)
			grow();
		data[count++] = value;
	}

	void clear(void){
		count =  0 ;
	}

	Vector(Int _capacity =  16 , Int _increment =  0 ){
		count =  0 ;
		capacity = _capacity ? _capacity:  16 ;
		increment = _increment;
		data = new T[capacity];
	}

	virtual ~Vector(void){
		delete[] data;
	}
};


2 Анатолий Широков
Можно ссылочку на стандарт или хотя бы его код (по которому его можно найти)?
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]