Форум программистов, компьютерный форум CyberForum.ru

list.merge( - C++

Восстановить пароль Регистрация
 
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
23.09.2011, 11:44     list.merge( #1
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
44
45
46
47
48
49
50
51
52
53
54
// list_merge.cpp
  // compile with: /EHsc
#include "stdafx.h"
  #include <list>
  #include <iostream>
  
  int main( ) 
  {
     using namespace std;
     list <int> c1, c2, c3;
     list <int>::iterator c1_Iter, c2_Iter, c3_Iter;
     
     c1.push_back( 3 );
     c1.push_back( 6 );
     c2.push_back( 2 );
     c2.push_back( 4 );
     c3.push_back( 5 );
     c3.push_back( 1 );
     //то что ниже добавлено мной, дабы убедиться получу ли я ошибку такую же как в своем примере.если закомментить добавления то ошибки не будет
      c3.push_back( 1112);
       c3.push_back( 323);
        c3.push_back( 124331 );
        // далее все без изменений - пример их хэлпа по студии 10
  
     cout << "c1 =";
     for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
        cout << " " << *c1_Iter;
     cout << endl;
  
     cout << "c2 =";
     for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ )
        cout << " " << *c2_Iter;
     cout << endl;
  
     c2.merge( c1 );  // Merge c1 into c2 in (default) ascending order
     c2.sort( greater<int>( ) );
     cout << "After merging c1 with c2 and sorting with >: c2 =";
     for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ )
        cout << " " << *c2_Iter;
     cout << endl;
  
     cout << "c3 =";
     for ( c3_Iter = c3.begin( ); c3_Iter != c3.end( ); c3_Iter++ )
        cout << " " << *c3_Iter;
     cout << endl;
  
     c2.merge( c3, greater<int>( ) );
     cout << "After merging c3 with c2 according to the '>' comparison relation: c2 =";
     for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ )
        cout << " " << *c2_Iter;
     cout << endl;
 
return 0;
  }

данный код это копи паст из хелпа по студии 10 на тему list.merge().

Вопрос в следующем. Читая про объединение я понял что перед слиянием списки надо отсортировать, и да после этого оно работает. Так же Страуаутсруп пишет что можно слить списки если один не отсортирован(просто поярдок не определен будет) - тоже в дебаге вылетает на ошибку. Так же имеется второй параметр при сортировке - можно как бы задать критерий. И тут в дебаге я натолкнулся на постоянно вылетающую ошибку - последовательность (порядок) не задан. Полез в хелп и там увидел этот пример. И да он работает, но если добавить в список 3 еще несколько циферок, то в дебаге выскочит та же ошибка. Может кто подскажет пачему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
23.09.2011, 11:46  [ТС]     list.merge( #2
вот ошибка
Миниатюры
list.merge(  
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
23.09.2011, 12:01     list.merge( #3
Цитата Сообщение от AzaKendler Посмотреть сообщение
последовательность (порядок) не задан
Правильно будет "Последовательность не упорядочена"
Цитата Сообщение от AzaKendler Посмотреть сообщение
И да он работает, но если добавить в список 3 еще несколько циферок, то в дебаге выскочит та же ошибка.
Если ты внимательно присмотришься, то увидишь, что в исходном коде все списки упорядочены. Первые два по возрастанию, последний по убыванию. А вот добавление своих циферок в последний список упорядоченность нарушают.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Так же Страуаутсруп пишет что можно слить списки если один не отсортирован(просто поярдок не определен будет) - тоже в дебаге вылетает на ошибку.
Компиляторы не всегда "слушают" Страуструпа. Тут все зависит от прихоти разработчика.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
23.09.2011, 12:11  [ТС]     list.merge( #4
c2.merge( c3, greater<int>( ) );
разве эта строчка не "пытается" отсортировать на ходу при последнем объединении? Сбой происходит именно на этом, если добавить в 3й список циферок. И мне показалось что сюда 3й список приходит все таки не отсортированным

Добавлено через 2 минуты
Цитата Сообщение от kazak Посмотреть сообщение
А вот добавление своих циферок в последний список упорядоченность нарушают
кажется понял....
короче говоря фуфло это. лучше сразу готовить списки до объединения.

Добавлено через 1 минуту
ты прав...
C++
1
2
3
4
5
6
7
c3.push_back( 50 );
     c3.push_back( 49 );
     //то что ниже добавлено мной, дабы убедиться получу ли я ошибку такую же как в своем примере.
      c3.push_back( 46);
       c3.push_back( 43);
        c3.push_back( 12 );
        // далее все без изменений - пример их хэлпа по студии 10
так..работает
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
23.09.2011, 12:20     list.merge( #5
Насколько я понял msdn, greater не сортирует входной список, а задает порядок элементов в выходном списке.
И выдержка по поводу упорядоченности для merge
Both sequences must be previously ordered by operator<
Yandex
Объявления
23.09.2011, 12:20     list.merge(
Ответ Создать тему
Опции темы

Текущее время: 17:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru