ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 01.11.2009, 17:46
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме:
1354067

Репутация: 599


По умолчанию

Код:
#include <iostream>
#include <vector>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <functional>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> elements;

	elements.push_back(1);
	elements.push_back(2);
	elements.push_back(3);
	elements.push_back(4);
	elements.push_back(5);

	int del_element = 3;

	cout << "before remove:";
	BOOST_FOREACH(int val, elements) cout << " " << val;

	vector <int>::iterator new_end = remove_if(elements.begin(), elements.end(), 
            boost::bind(std::equal_to<int>(), _1, del_element));
	elements.erase (new_end, elements.end( ) );

	cout << "\nafter remove: ";
	BOOST_FOREACH(int val, elements) cout << " " << val;

	cout << '\n';

	system("pause");
}
вариант удаления юзая boost и stl(без циклов, описанных вручную, что имхо гораздо нагляднее и быстрее понимается).

Последний раз редактировалось Ra$cal; 01.11.2009 в 17:48..
 

  #2  
Старый 01.11.2009, 17:49
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

нет с erase должно быть всё ок
ошибку в студию
 

  #3  
Старый 01.11.2009, 17:57
VIP
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме:
89596

Репутация: 21
Отправить сообщение для VIP с помощью ICQ
По умолчанию

Цитата:
Сообщение от Irdis  
нет с erase должно быть всё ок
ошибку в студию
извиняюсь за принт-скрин, но думаю так будет точнее:

 

  #4  
Старый 01.11.2009, 17:54
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме:
1354067

Репутация: 599


По умолчанию

с вектором кстати проще работать не через иетарторы, а через оператор [], как с обычным массивом.
Код:
for(int i = 0; i < elements.size(); i++){
    if(elements[i] == del_element){
        elements.erase(elements.begin() + i);
        // важный момент. из-за удаления пропускаем одну запись, если не править i
        i--;
    }
}

Последний раз редактировалось Ra$cal; 01.11.2009 в 18:13..
 

  #5  
Старый 01.11.2009, 18:11
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме:
1354067

Репутация: 599


По умолчанию

кстати, в примере с erase, который я привел, обязательно делай break после удаления элемента или делай декремент счетчика i, т.к. сбивается связь указателя и записей в векторе, можно проскочить запись после каждого удаления.
 

  #6  
Старый 01.11.2009, 18:14
VIP
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме:
89596

Репутация: 21
Отправить сообщение для VIP с помощью ICQ
По умолчанию

Цитата:
Сообщение от Ra$cal  
кстати, в примере с erase, который я привел, обязательно делай break после удаления элемента или делай декремент счетчика i, т.к. сбивается связь указателя и записей в векторе, можно проскочить запись после каждого удаления.
Хорошо, спасибо за помощь и за подсказку! Учту.
 

  #7  
Старый 01.11.2009, 18:14
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

вотъ... а break делать не надо, если два одинаковых элемента то он удалит только первый
Код:
	vector<int>::iterator i = a.begin();
		while( i!=a.end())
		{
		if((int)(*i) == del_element)
				i=a.erase(i);		
		else
			i++;
		
		};

Последний раз редактировалось Irdis; 01.11.2009 в 18:16..
 

  #8  
Старый 01.11.2009, 18:22
VIP
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме:
89596

Репутация: 21
Отправить сообщение для VIP с помощью ICQ
По умолчанию

Цитата:
Сообщение от Irdis  
вотъ... а break делать не надо, если два одинаковых элемента то он удалит только первый
Код:
	vector<int>::iterator i = a.begin();
		while( i!=a.end())
		{
		if((int)(*i) == del_element)
				i=a.erase(i);		
		else
			i++;
		
		};
OK. То есть как я понял VectorName.erase(IteratorName) возвращает итератор на следующий за удалённым элемент?
 

  #9  
Старый 01.11.2009, 18:26
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

Да... именно так,
а если удаляем последний элемент, то возвращается на конец
 

  #10  
Старый 01.11.2009, 18:28
VIP
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме:
89596

Репутация: 21
Отправить сообщение для VIP с помощью ICQ
По умолчанию

Цитата:
Сообщение от Irdis  
Да... именно так,
а если удаляем последний элемент, то возвращается на конец
Спасибо большое за помощь!
 
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ