Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > std::vector<>::erase?


Автор: Astoret 2.7.2009, 11:31
Никак немогу найти как ведет себя метод 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;
        }
    }

Автор: azesmcar 2.7.2009, 11:37
http://www.cplusplus.com/reference/stl/vector/erase/\

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

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

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

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

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

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

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

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

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

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

я не о данном случае говорил. В данном случае как я сказал "это некрасиво" (читайте неправильно smile )

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

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

Автор: Astoret 2.7.2009, 13:40
Цитата(azesmcar @ 2.7.2009,  11:37)
http://www.cplusplus.com/reference/stl/vector/erase/\

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

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

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

Спасибо за ссылочку

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

Автор: bsa 2.7.2009, 14:34
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());

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

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

Автор: Cheloveck 2.7.2009, 19:21
andrew_121, тем не менее он гарантирует))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)