0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 17
1

Программа аварийно завершается с ошибкой "map/set iterators are incompatible"

02.10.2016, 15:17. Показов 1456. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Проблема такая: в s1 и s2 рандомно добавляю числа, хочу найти объединение этих множеств. Если использовать такой код, то все в порядке, НО результатом является объединение множеств, т.к. если в первом множестве несколько одинаковых значений, он их все запишет в s4:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
multiset<int> get_intersection_simple(multiset<int> s1,multiset<int> s2)
{
    multiset<int> s4;
    if (s1.size()<s2.size())
    {
        for (auto ptr = s1.begin(); ptr!=s1.end(); ptr++)
        {
            if (s2.find(*ptr)!=s2.cend())
                s4.insert(*ptr);
        }
    }
 
    else 
    {
        for (auto ptr = s2.begin(); ptr!=s2.end(); ptr++)
        {
            if (s1.find(*ptr)!=s1.cend())
                s4.insert(*ptr);
        }
 
    }
    return s4;
}
Если же я хочу добавить условие равенства позиций итератора и найденного элемента(т.к. в мультисет у нас упорядочены числа), то все компилируется но программа обрывается с ошибкой: Map/set iterators are incompatible

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
multiset<int> get_intersection_simple(multiset<int> s1,multiset<int> s2)
{
    multiset<int> s4;
    multiset<int>::iterator ptr;
    multiset<int>::iterator ptr1;
    multiset<int>::iterator ptr2;
    if (s1.size()<s2.size())
    {
         for (ptr=s1.begin(); ptr!=s1.cend(); ptr++)
          {
            s2.find(*ptr)=ptr1;
            if (s2.find(*ptr)!=s2.cend() || ptr1==ptr)
            {s4.insert(*ptr);}
            else ptr++;    
          }
.
.
.
    }
    return s4;
}
Как избавится от ошибки? Программу надо реализовать именно таким образом. Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2016, 15:17
Ответы с готовыми решениями:

Map/set iterators are incompatible
void Delete(int a , int b) { multiset &lt;double&gt; ::iterator First, Last; multiset &lt;double&gt;...

map/set iterators incompatible
std::map&lt;std::string, int&gt; m; std::string s=&quot;Mon Tue Wed Thu Fri Sat San&quot;;...

Ошибка Expression map/set iterators incompatible
Здравствуйте. Нашёл некий код, который я почти пофиксил, осталась следующая проблема: &quot;Ошибка...

программа завершается аварийно
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт...

Программа аварийно завершается
Доброго времени суток! Моя программа аварийно завершается вернув значение &quot;255 (0xFF)&quot; Прошу...

7
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
02.10.2016, 15:41 2
Цитата Сообщение от psycho9661 Посмотреть сообщение
s2.find(*ptr)=ptr1;
странная строка, ptr1 не инициализирован.

есть std::set_intersection, почему им не воспользоваться?
1
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 17
02.10.2016, 16:41  [ТС] 3
Таково задание. Но вообще, как я понял, это не правильно, т.к. у меня разные размеры s1 и s2, соотвественно они на разных позициях стоять могут. Как сделать?
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
02.10.2016, 22:44 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void get_intersection_simple(multiset<int> &s1,multiset<int> &s2, multiset<int> &result)
{   
    multiset<int>::const_iterator ptr1 = s1.begin();
    multiset<int>::const_iterator ptr2 = s2.begin();
 
    while (ptr1!=s1.end() && ptr2!=s2.end())
    {
        if (*ptr1<*ptr2) ++ptr1;
        else if (*ptr2<*ptr1) ++ptr2;
        else 
        {
            result.insert(*ptr1);
            ++ptr1; 
            ++ptr2;
        }
      }
}
"Map/set iterators are incompatible" - возникает при сравнении итераторов из разных множеств.
1
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 17
03.10.2016, 20:41  [ТС] 5
Цитата Сообщение от sergestus Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void get_intersection_simple(multiset<int> &s1,multiset<int> &s2, multiset<int> &result)
{   
    multiset<int>::const_iterator ptr1 = s1.begin();
    multiset<int>::const_iterator ptr2 = s2.begin();
 
    while (ptr1!=s1.end() && ptr2!=s2.end())
    {
        if (*ptr1<*ptr2) ++ptr1;
        else if (*ptr2<*ptr1) ++ptr2;
        else 
        {
            result.insert(*ptr1);
            ++ptr1; 
            ++ptr2;
        }
      }
}
"Map/set iterators are incompatible" - возникает при сравнении итераторов из разных множеств.
такой вариант я уже оформил, спасибо
преподаватель требует тот, не получается(
не подскажете, как через set_intersection сделать? чтобы отдельно оформить как мультисет и результат пересечения добавить в отдельное множество? вывод у меня оформлен вот так
C++
1
2
3
4
5
6
7
8
9
template <class Container> void container_output(Container container)
{
    if (container.empty())
        cout << "Empty container";
    else
        for (auto ptr = container.begin(); ptr!=container.end(); ++ptr)
                cout << *ptr << "  ";
    cout << endl<<endl;
}
то есть надо написать set_intersection как мультисет и добавить во множество и вернуть это множество, спасибо заранее
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
03.10.2016, 22:29 6
Не совсем понимаю, что вам нужно, вот тот же вариант, который возвращает мультисет с помощью return:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
multiset<int> get_intersection_simple(multiset<int> &s1,multiset<int> &s2)
{   
    multiset<int>::const_iterator ptr1 = s1.begin();
    multiset<int>::const_iterator ptr2 = s2.begin();
    multiset<int> result
 
    while (ptr1!=s1.end() && ptr2!=s2.end())
    {
        if (*ptr1<*ptr2) ++ptr1;
        else if (*ptr2<*ptr1) ++ptr2;
        else 
        {
            result.insert(*ptr1);
            ++ptr1; 
            ++ptr2;
        }
     }
     return result;
}
1
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 17
04.10.2016, 23:09  [ТС] 7
Добавлено через 44 секунды
Цитата Сообщение от sergestus Посмотреть сообщение
Не совсем понимаю, что вам нужно, вот тот же вариант, который возвращает мультисет с помощью return:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
multiset<int> get_intersection_simple(multiset<int> &s1,multiset<int> &s2)
{   
    multiset<int>::const_iterator ptr1 = s1.begin();
    multiset<int>::const_iterator ptr2 = s2.begin();
    multiset<int> result
 
    while (ptr1!=s1.end() && ptr2!=s2.end())
    {
        if (*ptr1<*ptr2) ++ptr1;
        else if (*ptr2<*ptr1) ++ptr2;
        else 
        {
            result.insert(*ptr1);
            ++ptr1; 
            ++ptr2;
        }
     }
     return result;
}
как set_intersection написать, чтобы итоговое пересечение записать в мультисет?
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
05.10.2016, 17:46 8
Цитата Сообщение от psycho9661 Посмотреть сообщение
как set_intersection написать, чтобы итоговое пересечение записать в мультисет?
так get_intersection_simple так и работает, создает мултисет, записывает туда пересечение множеств и возвращает его.
1
05.10.2016, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2016, 17:46
Помогаю со студенческими работами здесь

Приложение аварийно завершается с ошибкой "Segmentation fault"
Добрый день. Пишу в NetBeans 8.1 Делаю простую задачу: Открыть из txt файла список друзей Мэта,...

Expression:map/set incompatible
Не могу понять почему возникает ошибка дело в том что данный код работает set&lt;int&gt; Multic;...

Expression:map/set incompatible
Подскажите пожалуйста почему происходит ошибка в этом коде: set&lt;int&gt; S;...

Программа постоянно аварийно завершается
Подскажите,пожалуйста, что делать. Никак не могу запустить программу, постоянно программа аварийно...

Программа на других компьютерах завершается аварийно
Здравствуйте, у меня дикая проблема: я написал программу (кинуть код не могу, он очень большой,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru