Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2017, 18:14   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Беззнаковые целые как индексы массива в цикле

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

Код:
template <typename TData>
void CArray<TData>::insert(unsigned int _index, const TData & _value)
{
	check_index(_index, "CArray::insert: Index out of range");
	check_and_realloc();

	for (std::size_t i = size() - 1; i >= _index; --i)
		elements[i + 1] = elements[i];
	elements[_index] = _value;
}
Здесь функция check_index проверяет допустимость индекса и выбрасывает исключение; check_and_realloc увеличивает размер динамического массива при необходимости.

Условие цикла i >= _index никогда не выполняется из-за того, что int без знака. Как можно исправить эту проблему?
Aoizora вне форума Ответить с цитированием
Старый 16.05.2017, 19:07   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Почему не выполнится, если должно выполнится? size_t - это же по-моему int тот же самый, ну а почему не выполняется-то? Замените тип i на unsigned int. И в условии я бы заменил ">=" на просто ">".
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 16.05.2017, 19:59   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

У вас, кроме всего прочего, выход за пределы массива.
Начинайте от size() - 1 повторяйте до i > index + 1
Сдвиг делайте так:
elem[i] = elem[i - 1]
waleri вне форума Ответить с цитированием
Старый 16.05.2017, 20:27   #4
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Переписал вот так:

Код:
template <typename TData>
void CArray<TData>::insert(unsigned int _index, const TData & _value)
{
	check_index(_index, "CArray::insert: Index out of range");
	check_and_realloc();

	for (std::size_t i = size() - 1; i > _index + 1; --i)
		elements[i] = elements[i - 1];
	elements[_index] = _value;
	++first_free;
}
Код:
arr.insert(0, -1);
Теперь вставка невозможна в массив, состоящий из двух элементов, потому что тогда цикл не выполняется ни разу. Как можно это исправить?

Последний раз редактировалось Aoizora; 16.05.2017 в 20:33.
Aoizora вне форума Ответить с цитированием
Старый 17.05.2017, 21:01   #5
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
for (std::size_t i = size() - 1; i > _index + 1; --i)
Код:
for (std::size_t i = size() - 1; i > _index; --i)
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 18.05.2017, 13:57   #6
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Код:
for (std::size_t i = size() - 1; i > _index; --i)
>std::size_t i = size() - 1;
Вот насчет этого выражения у меня сомнения. Мой вектор устроет так: есть динамический массив elements, состоящий из элементов произвольного типа, указатели этого типа first_free на первый свободный элемент и cap на конец массив. Размер вектора вычисляется как first_free - elements, емкость как cap - elements. Увеличение размера вектора происходит автоматически при выполнении некоторых операций, когда size() == capacity(). Теперь об индексах. При перемещении элементов вправо, мне кажется, надо сначала занимать позицию, на которую указывает указатель first_free, сдвигать все элементы до _index включительно, а на место _index ставить новый элемент.
Aoizora вне форума Ответить с цитированием
Старый 18.05.2017, 14:06   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я думаю, что в итоге будет так:
Код:
for (std::size_t i = size() - 1; i > _index + 1; --i)
  arr[i]  = arr[i - 1];
Последний элемент всегда свободен, ибо размер массива увеличен...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Прошу помощи]Индексы массива Romalikons Общие вопросы C/C++ 4 12.10.2014 16:27
Напечатать индексы элементов массива Dark Illusion Общие вопросы C/C++ 1 15.12.2012 17:33
Обработка массива в цикле marauder1919 Общие вопросы C/C++ 3 10.08.2012 19:28
на Си++ описать длинные беззнаковые целые числа Alisa91 Помощь студентам 0 05.12.2011 19:54