Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40

Слияние двух векторов в третий по условию

15.03.2015, 18:39. Показов 2729. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста как написать сравнение
двух массивов (массив старых и массив новых значений) с записью в третий всех измененных значений - только тех элементов, которых в старом массиве не было, а в новом появились, только тех элементов которые в старом массиве были, а в новом их нет, и элементов, у которых изменилось состояние
массивы имеют вид
std::vector<Class> old;
std::vector<Class> current;
Class содержит поля
dword objectId;
dword objectState;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2015, 18:39
Ответы с готовыми решениями:

Слияние двух векторов
Дано два одномерных массива A и B. Помогите, пожалуйста с кодом: нужно соединить их в один массив C.

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

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

11
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
15.03.2015, 19:22
gutalin, Извольте:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <vector>
#include <algorithm>
 
struct Object {
  size_t id;
  size_t state;
};
 
struct LessByAllFields {
  bool operator()(const Object &first, const Object &second) {
    if (first.id == second.id) {
      return first.state < second.state;
    }
    return first.id < second.id;
  }
};
 
struct LessById {
  bool operator()(const Object &first, const Object &second) {
    return first.id < second.id;
  }
};
 
std::ostream &operator<<(std::ostream &out, const Object &obj) {
  return out << "id " << obj.id << " state " << obj.state << ' ';
}
 
std::ostream &operator<<(std::ostream &out,
                         const std::vector<Object> &objects) {
  for (auto object : objects) {
    out << object << ' ';
  }
  return out << '\n';
}
 
template <typename Comp>
std::vector<Object> UniqueInFirst(const std::vector<Object> &first,
                                  const std::vector<Object> &second,
                                  Comp comp) {
  std::vector<Object> unique_in_first;
  std::set_difference(second.begin(), second.end(), first.begin(), first.end(),
                      std::back_inserter(unique_in_first), comp);
  return unique_in_first;
}
 
template <typename Comp>
std::vector<Object> Intersection(const std::vector<Object> &first,
                                 const std::vector<Object> &second, Comp comp) {
  std::vector<Object> unique_in_first;
  std::set_intersection(first.begin(), first.end(), second.begin(),
                        second.end(), std::back_inserter(unique_in_first),
                        comp);
  return unique_in_first;
}
 
int main() {
  std::vector<Object> old = {{0, 0}, {1, 1}, {2, 2}, {3, 3}};
  std::vector<Object> current = {{4, 4}, {0, 0}, {2, 3}, {3, 5}};
 
  std::sort(old.begin(), old.end(), LessByAllFields());
  std::sort(current.begin(), current.end(), LessByAllFields());
 
  std::cout << "Old vector             : " << old;
  std::cout << "Current vector         : " << current;
  std::cout << "Only new elements      : " << UniqueInFirst(old, current,
                                                            LessByAllFields());
  std::cout << "Only old elements      : " << UniqueInFirst(current, old,
                                                            LessByAllFields());
  std::cout << "Same with state changed: \n"
            << "in old: " << Intersection(old, current, LessById())
            << "in new: " << Intersection(current, old, LessById());
}
Пруф работоспособности:
http://ideone.com/D5IHF9
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
15.03.2015, 20:36  [ТС]
Wow, я конечно догадывалась что у std такой богатый набор решений, но не настолько!

Добавлено через 48 секунд
круто написано, спасибо
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 21:13
Melg,а третий вектор где?
И кажется не правильно

Как отвечать определенному человеку?

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
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
 
using namespace std;
 
struct Object {
    size_t id;
    size_t state;
};
 
bool operator < (const Object& f, const Object& l) {
    if (f.id < l.id && l.state << l.state) return true;
    else return false;
}
 
 
vector<Object> merge(vector<Object>& first, vector<Object>& last);
 
int main() {
    vector<Object> oldv = { {0,1}, {1,2},{3,4} };
    vector<Object> newv = { {0,1}, {1,2},{6,7} };
 
    vector<Object> v3 = merge(oldv, newv);  //  6.7 3.4 
    cout << v3.size() << endl;
 
    for(auto i : v3) cout << i.id << "," << i.state << endl;
 
    return 0;
}
 
 
vector<Object> merge(vector<Object>& first, vector<Object>& last) {
    vector<Object> v3;
 
    set<Object> s1(first.begin(), first.end());
    set<Object> s2(last.begin(), last.end());
 
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v3));
    set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(v3));
 
    return v3;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.03.2015, 22:07
Цитата Сообщение от Kant Посмотреть сообщение
Как отвечать определенному человеку?
Щелкнуть по его нику слева над аватаром и статусом.

Добавлено через 24 минуты
Цитата Сообщение от Kant Посмотреть сообщение
l.state << l.state
Здесь наверное предполагалось что-то другое.
1
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 23:59
MrGluck, спасибо!

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
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
 
using namespace std;
 
struct Object {
    size_t id;
    size_t state;
};
 
bool operator < (const Object& f, const Object& l) {
    if (f.id < l.id && f.state < l.state) return true;
    else return false;
}
 
 
vector<Object> merge(vector<Object>& first, vector<Object>& last);
 
int main() {
    vector<Object> oldv = { {0,1}, {1,2},{3,4} };
    vector<Object> newv = { {0,1}, {1,2},{6,7} };
 
    vector<Object> v3 = merge(oldv, newv);  //  6.7 3.4
    cout << v3.size() << endl;
 
    for(auto i : v3) cout << i.id << "," << i.state << endl;
 
    return 0;
}
 
 
vector<Object> merge(vector<Object>& first, vector<Object>& last) {
    vector<Object> v3;
 
    set<Object> s1(first.begin(), first.end());
    set<Object> s2(last.begin(), last.end());
 
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v3));
    set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(v3));
 
    return v3;
}
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
16.03.2015, 18:54  [ТС]
Отличный способ, правда подходит только для упорядоченных массивов
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.03.2015, 18:55
Цитата Сообщение от gutalin Посмотреть сообщение
Отличный способ, правда подходит только для упорядоченных массивов
Определите operator< для Object и вызовите std::sort перед merge.
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
16.03.2015, 19:30  [ТС]
bool operator < (const Object& f, const Object& l)
пишет - слишком много параметров для этой функции оператора

Добавлено через 3 минуты
точнее
bool Object::operator < (const Object& f, const Object& l)

Добавлено через 4 минуты
Всё, разобралась
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
22.04.2015, 10:43  [ТС]
а можно ли без сортировки сделать? просто сортировка меняет правильную последовательность объектов местами, это неправильно
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
22.04.2015, 15:22
gutalin, приведи пример.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.04.2015, 15:35
Цитата Сообщение от gutalin Посмотреть сообщение
просто сортировка меняет правильную последовательность объектов местами, это неправильно
Вы наверное имеете в виду устойчивую сортировку. Если брать готовое решение, то это std::stable_sort. std::sort - неустойчивая сортировка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2015, 15:35
Помогаю со студенческими работами здесь

Из двух векторов, создать третий состоящий из повторяющихся чисел находящихся в первых двух.
из двух векторов, создать третий состоящий из повторяющихся чисел находящихся в первых двух то есть если если есть два вектора ...

Слияние двух массивов, заполненных случайными числами, в третий
Доброго времени суток,подскажите,возможно кто то знает как решить задачу ниже..у самого ничего не получается.. Заранее Большое Спасибо! ...

Провести слияние двух массивов по возрастанию, создавая третий массив
Провести слияние двух массивов по возрастанию, создавая третий массив. Помогите пожалуйста:(

Из двух векторов сформировать третий
Люди,помогите!!!У меня не получается=(.. Заранее спасибо!!!!! Составить схему алгоритма и программу записи подряд из массива С...

Выполнить слияние двух рассортированных бинарных файлов в третий упорядоченный файл
Доброго времени суток уважаемые форумчане!!!! У меня есть следующая задача - Выполнить слияние двух рассортированных бинарных файлов в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru