Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::vector<>::erase? 
:(
    Опции темы
Astoret
Дата 2.7.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

Репутация: 1
Всего: 1



Никак немогу найти как ведет себя метод erase в vector
Он удаляет элемент массива и уменьшает сам массив на один или просто стирает с этого места данные?
И не совсем понял как он работает, гугл дал что передать итератор указывающий на удаляемый элемент, а что за интератор я так и не понял, если не трудно скажите как реализовать удаление элемента:
Код

for (j= 0; j<this->Data.size(); j++)
    {
    if(this->Data[j].INN==B.Data[i].INN)
        {
        this->Data.erase(i); //Как правильно?
        eq = true;
        continue;
        }
    }

PM MAIL WWW   Вверх
azesmcar
Дата 2.7.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



http://www.cplusplus.com/reference/stl/vec...rase/\

перевод нужен?

Добавлено через 2 минуты и 50 секунд
Цитата(Astoret @  2.7.2009,  11:31 Найти цитируемый пост)
this->Data.erase(i); //Как правильно

он принимает итератор. Лучше использовать find, он вернет итератор на найденный элемент (или end() если не найдет).
хотя вектор работает с random access iterator, так что Data.begin() + i тоже пойдет, но это некрасиво.
PM   Вверх
andrew_121
Дата 2.7.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(azesmcar @  2.7.2009,  11:37 Найти цитируемый пост)
хотя вектор работает с random access iterator, так что Data.begin() + i тоже пойдет, но это некрасиво. 

А по ручкам, линеечкой! smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 2.7.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(andrew_121 @  2.7.2009,  11:45 Найти цитируемый пост)
А по ручкам, линеечкой! smile  

чем тебе + на random access iterator-е не по душе?

PM   Вверх
mes
Дата 2.7.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  2.7.2009,  10:48 Найти цитируемый пост)
чем тебе + на random access iterator-е не по душе?

наверно потому, что не было указано, что результативное значение итератора должно быть в диапозоне [begin(), end()]


Это сообщение отредактировал(а) mes - 2.7.2009, 11:56


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 2.7.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mes @  2.7.2009,  11:56 Найти цитируемый пост)
наверно потому, что не было указано, что результативное значение итератора должно быть в диапозоне [begin(), end()]

я не о данном случае говорил. В данном случае как я сказал "это некрасиво" (читайте неправильно smile )
PM   Вверх
andrew_121
Дата 2.7.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(azesmcar @  2.7.2009,  11:48 Найти цитируемый пост)
чем тебе + на random access iterator-е не по душе?

Не хорошо смешивать.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Astoret
Дата 2.7.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

Репутация: 1
Всего: 1



Цитата(azesmcar @ 2.7.2009,  11:37)
http://www.cplusplus.com/reference/stl/vec...rase/\

перевод нужен?

Добавлено @ 11:39
Цитата(Astoret @  2.7.2009,  11:31 Найти цитируемый пост)
this->Data.erase(i); //Как правильно

он принимает итератор. Лучше использовать find, он вернет итератор на найденный элемент (или end() если не найдет).
хотя вектор работает с random access iterator, так что Data.begin() + i тоже пойдет, но это некрасиво.

Спасибо за ссылочку
PM MAIL WWW   Вверх
Cheloveck
Дата 2.7.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Стандарт гарантирует, что все элементы std::vector находятся последовательно друг за другом, тоесть точно так же, как и в массиве. Следовательно, метод erase, удаляя элемент, смещает все последующие на один элемент назад. Итераторы - это как указатели, тока навороченные))) Тут лучше доки читать.


--------------------
user posted image
PM Jabber   Вверх
bsa
Дата 2.7.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Astoret, правильно так:
Код
struct DataCompare
{
    DataCompare(const DataType &s, bool &ed) : s_(s), ed_(ed) {}
    bool operator()(const DataType &d) const {
        bool x = d.INN == s_.INN;
        ed_ |= x;
        return x;
    }
private:
     const DataType &s_;
     bool &ed_;
};

...
this->Data.erase(std::remove_if(this->Data.begin(), this->Data.end(), DataCompare(B.Data[i], ed), this->Data.end());

PM   Вверх
andrew_121
Дата 2.7.2009, 16:59 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Cheloveck @  2.7.2009,  13:46 Найти цитируемый пост)
Стандарт гарантирует, что все элементы std::vector находятся последовательно друг за другом

А для этого нужно стандарт читать? Название контейнера не о чем не говорит? Векторов, которые бы работали по другому, не встречал)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Cheloveck
Дата 2.7.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



andrew_121, тем не менее он гарантирует))


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.