ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

01.11.2009, 17:46
|
|
Постоянный
Регистрация: 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..
|
|
|

01.11.2009, 17:49
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
нет с erase должно быть всё ок
ошибку в студию
|
|
|

01.11.2009, 17:57
|
|
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме: 89596
Репутация:
21
|
|
Сообщение от Irdis
нет с erase должно быть всё ок
ошибку в студию
извиняюсь за принт-скрин, но думаю так будет точнее:

|
|
|

01.11.2009, 17:54
|
|
Постоянный
Регистрация: 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..
|
|
|

01.11.2009, 18:11
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
кстати, в примере с erase, который я привел, обязательно делай break после удаления элемента или делай декремент счетчика i, т.к. сбивается связь указателя и записей в векторе, можно проскочить запись после каждого удаления.
|
|
|

01.11.2009, 18:14
|
|
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме: 89596
Репутация:
21
|
|
Сообщение от Ra$cal
кстати, в примере с erase, который я привел, обязательно делай break после удаления элемента или делай декремент счетчика i, т.к. сбивается связь указателя и записей в векторе, можно проскочить запись после каждого удаления.
Хорошо, спасибо за помощь и за подсказку! Учту. 
|
|
|

01.11.2009, 18:14
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
вотъ... а 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..
|
|
|

01.11.2009, 18:22
|
|
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме: 89596
Репутация:
21
|
|
Сообщение от 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) возвращает итератор на следующий за удалённым элемент?
|
|
|

01.11.2009, 18:26
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
Да... именно так,
а если удаляем последний элемент, то возвращается на конец
|
|
|

01.11.2009, 18:28
|
|
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме: 89596
Репутация:
21
|
|
Сообщение от Irdis
Да... именно так,
а если удаляем последний элемент, то возвращается на конец
Спасибо большое за помощь! 
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|