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

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

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

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

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

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

У меня есть вектор, написанный мной, из которого надо удалить элементы по некоторому условию. Для этого я делаю цикл от 0 до size() по всем элементам, для каждого элемента проверяю условие и удаляю элемент по его индексу.

Функция удаления устроена так: она просто сдвигает элементы, стоящие справа от index, на одну позицию влево (кстати, надо ли вызывать деструктор элемента при этом?) и декрементирует указатель first_free, указывающий на первый свободный элемент в массиве.

Функция size() вычисляется как first_free минус указатель на начало массива.

Проблема в том, что цикл удаления проходит по всем элементам исходного массива, но потом размер массива сокращается:

Код:
template <typename TData>
void CArray<TData>::erase(unsigned int _index)
{
	if (size() == 1)
	{
		free();	// clear()
	}
	else
	{
		for (std::size_t i = _index; i < size() - 1; ++i)
			elements[i] = elements[i + 1];
		--first_free;
	}
}
Из-за этого обрабатваются не все элементы.

Как можно реализовать удаление или изменить функцию erase() для правильной работы?
Aoizora вне форума Ответить с цитированием
Старый 18.05.2017, 19:39   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Код:
for (std::size_t i = _index + 1; i < size() - 1; ++i)
			elements[i - 1] = elements[i];
waleri вне форума Ответить с цитированием
Старый 18.05.2017, 19:50   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Исправил, но удаление элементов по условию все равно работает не так, как ожидается.

Код:
for (size_type i = 0; i < _array.size(); ++i)
	{
		if (_array[i].find_first_of("abcde") != std::string::npos)
			_array.erase(i);
	}
Aoizora вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
за максимальным элементом вектора С вставить максимальный элемент вектора А, иначе удалить все отрицательные элементы DIbmKa Паскаль, Turbo Pascal, PascalABC.NET 0 12.12.2016 20:09
Фортран. Удалить из массива нулевые элементы, передвинув на их место следующие элементы без нарушения порядка.. katya2.5 Помощь студентам 0 27.12.2013 21:01
элементы вектора с нулями Владюшка Помощь студентам 5 28.01.2010 14:35
элементы вектора realabs Общие вопросы C/C++ 7 03.10.2009 17:21