объединить два списка в один список - PullRequest
1 голос
/ 11 октября 2010

Я пытаюсь решить эту проблему: Поиск нескольких списков для пропущенных записей . Я использовал мультикарту для дублирования ключей. Вот мой код:

#include <iostream>
#include <map>
#include <list>
#include <utility>
using namespace std;
int main(){

    list<char>a;
    list<int> b;
    multimap<char,int>s;
    a.push_back('A');
    a.push_back('B');
    a.push_back('C');
    b.push_back(1);
    b.push_back(2);
    b.push_back(3);
    s.insert(std::pair<char,int>('A',1));
    s.insert(std::pair<char,int>('A',2));
    s.insert(std::pair<char,int>('B',2));
    s.insert(std::pair<char,int>('B',3));
    s.insert(std::pair<char,int>('C',1));
    s.insert(std::pair<char,int>('C',3));
    list<char>::iterator it;
    list<int>::iterator IT;
    multimap<char,int>::iterator i;
    for (i=s.begin();i!=s.end();i++){
        for (IT=b.begin();IT!=b.end();IT++){
            i=s.find(*IT);
            if (i==s.end()){
                cout<<(*i).first<< " "<<*IT<<endl;
            }
        }
    }

    return 0;
}

Он скомпилирован, но после запуска он перестает работать ненормально. Я думаю, что я не получаю доступ к элементам правильно. Пожалуйста, помогите мне. РЕДАКТИРОВАТЬ: я обновил свой код

#include <iostream>
#include <map>
#include <list>
#include <utility>
using namespace std;
int main(){

    list<char>a;
    list<int> b;
    multimap<char,int>s;
    a.push_back('A');
    a.push_back('B');
    a.push_back('C');
    b.push_back(1);
    b.push_back(2);
    b.push_back(3);
    s.insert(std::pair<char,int>('A',1));
    s.insert(std::pair<char,int>('A',2));
    s.insert(std::pair<char,int>('B',2));
    s.insert(std::pair<char,int>('B',3));
    s.insert(std::pair<char,int>('C',1));
    s.insert(std::pair<char,int>('C',3));
    list<char>::iterator it;
    list<int>::iterator IT;
    multimap<char,int>::iterator i;
    for (it=a.begin();it!=a.end();it++){
    for (i=s.begin();i!=s.end();i++){
        for (IT=b.begin();IT!=b.end();IT++){

            if ((*i).first==*it  && ((*i).second!=*IT)){

                cout<<(*i).first<< " "<<*IT<<endl;


            }


        }
    }
    }
        return 0;

}

но здесь слишком много комбинации, тогда мне нужно, так в чем же проблема? Я думаю, что она должна работать правильно

Ответы [ 2 ]

3 голосов
/ 11 октября 2010

Ваша проблема заключается здесь:

if (i==s.end()){
    cout<<(*i).first<< " "<<*IT<<endl;
}

если я s.end (), вы больше не можете получить к нему доступ.Это означает, что это недействительно.Вы должны проверить, что это не s.end ()

if( i != s.end() )

Это причина вашего сбоя.Тем не менее, у меня возникли проблемы с пониманием того, что вы намереваетесь дать лучшую рекомендацию о том, как решить вашу проблему.

Редактировать:

Решение проблемы может быть следующим:

#include <map>
#include <set>
#include <iostream>

struct d {
    char c;
    int i;
};

int main()
{
    d data[] = {
        { 'A', 1 },
        { 'A', 2 },
        { 'B', 2 },
        { 'B', 3 },
        { 'C', 1 },
        { 'C', 3 }
    };

    std::map< char, std::set<int> > data_map;
    for( size_t i = 0; i < sizeof(data)/sizeof(d); ++i ) {
        data_map[ data[i].c ].insert( data[i].i );
    }

    for( char c = 'A'; c < 'D'; ++c ) {
        for( int i = 1; i < 4; ++i ) {
            if( data_map[c].count( i ) == 0 ) {
                std::cout << c << " " << i << " is missing" << std::endl;
            }
        }
    }

    return 0;
}

Вывод:

A 3 is missing
B 1 is missing
C 2 is missing
1 голос
/ 11 октября 2010

Просто несколько советов для начала -

Запустите код в отладчике (VS 2008 express is free) - пошаговый код, проверьте переменные, и вы должны увидеть, что не так.

Переименуйте свои итераторы, чтобы было более понятно, что вы пытаетесь сделать - я, это и ИТ просто приводят к путанице.

Наконец - напишите, что вы пытаетесь сделать, прежде чем кодировать его - например,

For (all letters) 
{
   For (all numbers)
   {
      if (letter,number not in map)
         print out missing (letter, number)
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...