Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
booker
23 / 23 / 5
Регистрация: 21.11.2012
Сообщений: 106
#1

vector::erase()?

30.12.2012, 12:53. Просмотров 1762. Ответов 30
Метки нет (Все метки)

есть вектор структур

C++
1
2
3
4
5
struct person{
    string name;
    int age;
 
vector <person> repw;
задача отсортировать вектор так, чтобы каждый последующий контейнер при условии совпадений поля name был удалён.

пытаюсь так

C++
1
2
3
4
int it1,it2;
    for (it1 = 0;it1!=repw.size();it1++)
        for (it2 = it1+1;it2!=repw.size();it2++)
            if(repw[it1].name==repw[it2].name) repw.erase(repw.begin()+it2);
не выходит. С итераторами колдовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2012, 12:53
Ответы с готовыми решениями:

vector.erase
Помогите пожалуйста с синтаксисом удаления любого элемента из вектора Вот тут...

Ошибка с vector.erase
Выдает ошибку vector erase iterator outside range на моменте вывода нового...

std::vector::erase
Всем привет. Буду очень рад, если кто-нибудь может мне объяснить логику... см....

Функция Erase класса vector
Нужно удалить из вектора, в котором объекты авторского класса, объекты с весом...

Крах при vector.erase()
Всё вроде бы работает так, как мне надо...но когда остаётся 1 элемент и его...

30
Croessmah
++Ͻ
14500 / 8282 / 1556
Регистрация: 27.09.2012
Сообщений: 20,336
Записей в блоге: 3
Завершенные тесты: 1
30.12.2012, 12:56 #2
Цитата Сообщение от booker Посмотреть сообщение
С итераторами колдовать?
А почему бы и нет?
remove_copy_if же есть в STL
0
booker
23 / 23 / 5
Регистрация: 21.11.2012
Сообщений: 106
30.12.2012, 13:34  [ТС] #3
хехе еслиб силён я был в STL))

допустим определяю я итератор по правилам

vector<person> iterator it1;

но в структуре person поле name является типом string, т.е. размер всё равно не предопределён.

поэтому непонятно как быть.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
30.12.2012, 13:39 #4
booker, я не понимаю задание. Или есть конкретные вопросы?
0
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 14:23 #5
Походу нужно обеспечить уникальность элементов в контейнере.
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
30.12.2012, 14:26 #6
Цитата Сообщение от Avazart Посмотреть сообщение
Походу нужно обеспечить уникальность элементов в контейнере.
Тогда есть алгоритм unique, которому можно передать предикат, где реализовать сравнение имет структур.

Не по теме:

Это ответ автору ) просто, задание вроде такое, поэтому процитировал тебя :)

1
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 14:32 #7
Если так то сначала std::sort() потом std::unique().
Но если допустимо можно сразу использовать std::set (или std::map) вместо std::vector

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
remove_copy_if же есть в STL
Но в итоге все ровно нужно будет воспользоваться erase() так как remove только перемещает элементы в конец а не удаляет их.
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
30.12.2012, 14:34 #8
Цитата Сообщение от Avazart Посмотреть сообщение
Но в итоге все ровно нужно будет воспользоваться erase() так как remove только перемещает элементы в конец а не удаляет их.
Нет. Все элементы уйдут в output iterator без лишних. Потому что remove_copy
0
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 14:35 #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет. Все элементы уйдут в output iterator без лишних. Потому что remove_copy
Ну да не углядел...
Но только это лишнее копирование тогда...
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
30.12.2012, 14:47 #10
Цитата Сообщение от Avazart Посмотреть сообщение
Но только это лишнее копирование тогда...
В случае unique тоже копирование. Просто в одном контейнере
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.12.2012, 14:53 #11
Как по мне, unique самое то. Вот как бы я решил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
struct person{
    std::string name;
    int age;
 
    person(const std::string& s, const int val): name(s), age(val) {}
};
 
int main()
{
    auto print = [](const std::vector<person>& per)
    {
        for (auto& val : per) std::cout<<val.name<<"\n";
    };
 
    std::vector<person> repw;
    repw.push_back(person("Igor", 25));
    repw.push_back(person("Slava", 25));
    repw.push_back(person("Igor", 30));
    repw.push_back(person("Svetick", 25));
    repw.push_back(person("Igor", 18));
 
    print(repw);
 
    std::sort(repw.begin(), repw.end(), [](const person& per1, const person& per2){return per1.name<per2.name;});
    repw.erase(std::unique(repw.begin(), repw.end(), [](const person& per1, const person& per2){return per1.name==per2.name;}), repw.end());
 
    std::cout<<"\n********************************\n";
    print(repw);
 
    std::cout<<"\n";
    system("pause");
    return 0;
}
1
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 14:59 #12
C++
1
std::map<std::string,int> personS;
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.12.2012, 15:00 #13
booker, вот так это делается
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <ctime>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
 
struct person
{
    string name;
    int age;
};
 
int main()
{
    int i;
    person p1;
    person p2;
    person px;
    p1.name = "name1";p1.age = 10;
    p2.name = "name2";p2.age = 15;
    vector <person> pList;
    //Рандомное заполение
    srand(time(0));
    cout<<"Input : "<<endl;
    for(i = 0; i < 20; i++)
    {
        if(rand() % 2 == 1)
            px = p1;
        else
            px = p2;
        cout<<"struct # "<<i + 1<<" :\t"<<px.age<<"\t"<<px.name<<endl;
        pList.push_back(px);
    }
    for(i = 1; i < pList.size(); i++)
    {
        if(pList[i].name == pList[i - 1].name)
            pList.erase(pList.begin() + i--);
    }
    cout<<"Output : "<<endl;
    for(i = 0; i < pList.size(); i++)
        cout<<"struct # "<<i + 1<<" :\t"<<pList[i].age<<"\t"<<pList[i].name<<endl;
    return 0;
}
PS:Основной твой недочёт что при erase позиция i соответсвует следующему после удаляемого элемента и ты её на итерации проскакиваешь полагая что на i-м месте всё также будет удалённый элемент. Обрати внимание на i-- в моём коде...
От себя - итераторы, тяжеловесные констукции - зачем это всё? std::vector допускает простую адресацию по индексу, как к элементу массива
1
Миниатюры
vector::erase()?  
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 15:08 #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя - итераторы, тяжеловесные констукции - зачем это всё? std::vector допускает простую адресацию по индексу, как к элементу
Как раз через индексацию - медленнее...

Добавлено через 3 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
В случае unique тоже копирование. Просто в одном контейнере
Ну в принципе да, и тут как повезет (где меньше копирований будет)
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
30.12.2012, 15:20 #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя - итераторы, тяжеловесные констукции - зачем это всё? std::vector допускает простую адресацию по индексу, как к элементу массива
Не согласен!
При полной оптимизации итератор превращается в обычный указатель, и доступ к нему - обычная операция разыменования. В случае индексации на каждой итерации происходит прибавление к базе значения (i * sizeof( type )).
0
booker
23 / 23 / 5
Регистрация: 21.11.2012
Сообщений: 106
30.12.2012, 15:40  [ТС] #16
Основной твой недочёт что при erase позиция i соответсвует следующему после удаляемого элемента и ты её на итерации проскакиваешь полагая что на i-м месте всё также будет удалённый элемент. Обрати внимание на i-- в моём коде...
точно не учёл что индексы сдвигаются, спасибо исправил всё заработало.

Добавлено через 11 минут
go, просто нет еще достаточного понимания контейнеров, поэтому с индексами будет попонятней пока.
0
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 15:41 #17
Цитата Сообщение от booker Посмотреть сообщение
go, просто нет еще достаточного понимания контейнеров, поэтому с индексами будет попонятней пока.
Ну собственно зачем тогда вообще использовать STL ?
0
booker
23 / 23 / 5
Регистрация: 21.11.2012
Сообщений: 106
30.12.2012, 15:51  [ТС] #18
нужен был вектор, обычный динамический массив был бы менее эффективен в моём случае, свой вектор писать не хотелось))
0
-=ЮрА=-
30.12.2012, 16:11
  #19

Не по теме:

booker, многие на этом форуме мнят себя супер экспертами, не понимая, что на поверку не смогут даже что-то маломальски сложное написать, так что не бери в голову некоторые пустые замечания. От себя добавлю, что лично сам использую индексную адресацию и каких либо тормозов я не замечал, так что используй на здоровье если нравиться, захочешь потом перейдёшь на итераторы это всегда можно успеть сделать;)

0
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
30.12.2012, 16:13 #20
Всегда можно успеть пользоваться индексами, а с итераторов лучше начинать сразу...
Ибо это основы STL понимание которых дает возможности...
0
30.12.2012, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 16:13

Vector : iterator & erase
Всем доброго времени суток! Необходимо пройтись по двум векторам и удалить...

Vector <bool> erase iterator outside range
Помогите, пожалуйста. При компиляции появляется ошибка (фото ниже). Это...

Ошибка в функции erase для vector
cout &lt;&lt; &quot;How much numbers? : &quot;; int n; cin &gt;&gt; n; vector&lt;int&gt;array(n); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru