Хелп с Stl
От: Cru  
Дата: 27.05.03 17:21
Оценка:
пишу такой код


#include <map>
#include <iostream>
using namespace std;
int main()
{
    multimap<int,int> mmap;
    
    mmap.insert(make_pair(1,2));
    mmap.insert(make_pair(1,3));
    mmap.insert(make_pair(2,3));
    mmap.insert(make_pair(2,4));
    mmap.insert(make_pair(4,3));
    
    multimap<int,int>::iterator it;
    for(it = mmap.begin(); it != mmap.end(); it++)
        cout << "it->first " << it->first << " it->second " << it->second <<endl;
        
        
    for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);

    
    cout << endl;
    
    for(it = mmap.begin(); it != mmap.end(); it++)
        cout << "it->first " << it->first << " it->second " << it->second <<endl;
        
    if(mmap.size() == 0) cout << "it->first = 0 " << " it->second = 0 " <<endl;
 return 0;
}



выдает

it->first 1 it->second 2

it->first 1 it->second 3
it->first 2 it->second 3
it->first 2 it->second 4
it->first 4 it->second 3

it->first 2 it->second 3

it->first 2 it->second 4
it->first 4 it->second 3


когда пишу так


#include <map>
#include <iostream>
using namespace std;
int main()
{
    multimap<int,int> mmap;
    
    mmap.insert(make_pair(1,2));
    mmap.insert(make_pair(1,3));
    mmap.insert(make_pair(2,3));
    mmap.insert(make_pair(2,4));
    mmap.insert(make_pair(4,3));
    
    multimap<int,int>::iterator it;
    for(it = mmap.begin(); it != mmap.end(); it++)
        cout << "it->first " << it->first << " it->second " << it->second <<endl;
     
    
    mmap.erase(1);
    mmap.erase(2);
    mmap.erase(3);
    mmap.erase(4);
    
    cout << endl;
    
    for(it = mmap.begin(); it != mmap.end(); it++)
        cout << "it->first " << it->first << " it->second " << it->second <<endl;
        
    if(mmap.size() == 0) cout << "it->first = 0 " << " it->second = 0 " <<endl;
 return 0;
}



выдает

it->first 1 it->second 2

it->first 1 it->second 3
it->first 2 it->second 3
it->first 2 it->second 4
it->first 4 it->second 3

it->first = 0 it->second = 0


почему неполучается удалить все данные из малтимапа с помочью перврго способа? что не так?
зарание благодарен...
Re: Хелп с Stl
От: WolfHound  
Дата: 27.05.03 17:47
Оценка:
Здравствуйте, Cru, Вы писали:

Если надо просто удалить все елементы то так:
mmap.clear();
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Хелп с Stl
От: SloNN  
Дата: 27.05.03 17:51
Оценка:
Здравствуйте, Cru, Вы писали:

Cru>пишу такой код

Cru>
Cru>#include <map>        
Cru>    for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);    
Cru>


Cru>когда пишу так


Cru>    mmap.erase(1);
Cru>    mmap.erase(2);
Cru>    mmap.erase(3);
Cru>    mmap.erase(4);
Cru>

Cru>почему неполучается удалить все данные из малтимапа с помочью перврго способа? что не так?

Насколько я понимаю, после удаления элемента из мультимепа первым способом все последующие итераторы становятся невалидными, а во втором ты их удаляешь по индексу, так можно.

Вообще, если тебе нужно удаление элементов, можно написать свой предикат и удалять через


mmap.erase( remove_if( mmap.begin(), mmap.end(), predicate), mmap.end() );
Re: protected наследование
От: dkon  
Дата: 27.05.03 18:09
Оценка:
Здравствуйте, Cru, Вы писали:

Cru> for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);


Cru>почему неполучается удалить все данные из малтимапа с помочью перврго способа? что не так?

Cru>зарание благодарен...

итератор it при удалении становится невалидным, правильнее так:

for(it = mmap.begin(); it != mmap.end(); ) it = mmap.erase(it);

ну, или еще лучше mmap.clear();
Re[2]: Хелп с Stl
От: Cru  
Дата: 27.05.03 19:06
Оценка:
SloNN обьясни что значит "итераторы становятся невалидными" никогда к стыду своему от таком неслышал))
Re[2]: Хелп с Stl
От: Bell Россия  
Дата: 28.05.03 06:48
Оценка:
Здравствуйте, SloNN, Вы писали:


SNN>Насколько я понимаю, после удаления элемента из мультимепа первым способом все последующие итераторы становятся невалидными,


Неправильно. Невалидным становится только итератор, соответствовавший удаленному элементу. В первом варианте
for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);

соответсвенно проблема была в том, что it++ в цикле выполнялся для испорченного итератора

SNN>а во втором ты их удаляешь по индексу, так можно.

Если быть точным, то по ключу, а не по индексу.

SNN>Вообще, если тебе нужно удаление элементов, можно написать свой предикат и удалять через


SNN>
SNN>mmap.erase( remove_if( mmap.begin(), mmap.end(), predicate), mmap.end() );
SNN>


А примерчик можно привети?
Любите книгу — источник знаний (с) М.Горький
Re[3]: Хелп с Stl
От: Bell Россия  
Дата: 28.05.03 06:51
Оценка:
Здравствуйте, Cru, Вы писали:

Cru>SloNN обьясни что значит "итераторы становятся невалидными" никогда к стыду своему от таком неслышал))


int* arr = new int[3];
int* ptr = &arr[1];
delete [] arr;


После выполнения delete указатель ptr становится невалидным (недействительным). С итераторами примерно то же самое.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Unit test. Практика использования.
От: FreshMeat Россия http://www.rsdn.org
Дата: 28.05.03 09:14
Оценка:
Здравствуйте, dkon, Вы писали:

Cru>> for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);

Cru>>почему неполучается удалить все данные из малтимапа с помочью перврго способа? что не так?
Cru>>зарание благодарен...

D>итератор it при удалении становится невалидным, правильнее так:

D>for(it = mmap.begin(); it != mmap.end(); ) it = mmap.erase(it);

Для некоторых контейнеров это действительно так.
Для мультимэпы неверно. Есть три перегруженных метода erase, но ни один из них не возвращает итератор :)

void erase(iterator pos) Associative Container Erases the element pointed to by pos.
size_type erase(const key_type& k) Associative Container Erases the element whose key is k.
void erase(iterator first, iterator last) Associative Container Erases all elements in a range.
Хорошо там, где мы есть! :)
Re[3]: Хелп с Stl
От: SloNN  
Дата: 28.05.03 09:38
Оценка:
Здравствуйте, Bell, Вы писали:


SNN>>Вообще, если тебе нужно удаление элементов, можно написать свой предикат и удалять через


SNN>>
SNN>>mmap.erase( remove_if( mmap.begin(), mmap.end(), predicate), mmap.end() );
SNN>>


B>А примерчик можно привети?


Да, ты прав, не получается сделать такое на multimap. Я такое делал обычно на векторах, а на multimap не проверил.
В общем подумаю, может получится перегрузить его.
Re[2]: а причем тут "protected наследование"???
От: jazzer Россия Skype: enerjazzer
Дата: 28.05.03 09:39
Оценка:
Здравствуйте, dkon, Вы писали:

собственно, сабж
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Хелп с Stl
От: KPavel Россия  
Дата: 28.05.03 10:38
Оценка:
Здравствуйте, Cru, Вы писали:

Cru>пишу такой код



Cru>
        
Cru>    for(it = mmap.begin(); it != mmap.end(); it++) mmap.erase(it->first);

Cru>


Если удалять по итератору, а не по ключу, то этот цикл может выглядеть так:



for(it = mmap.begin(); it != mmap.end(); it = mmap.erase(it));



erase(итератор) возвращает итератор элемента, следующего за уничтоженным, ну или end().
Вообще, конечно, mmap.clear() было б проще .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.