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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста как написать сравнение
двух массивов (массив старых и массив новых значений) с записью в третий всех измененных значений - только тех элементов, которых в старом массиве не было, а в новом появились, только тех элементов которые в старом массиве были, а в новом их нет, и элементов, у которых изменилось состояние
массивы имеют вид
std::vector<Class> old;
std::vector<Class> current;
Class содержит поля
dword objectId;
dword objectState;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2015, 18:39
Ответы с готовыми решениями:

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

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

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

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

11
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
15.03.2015, 19:22 2
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  [ТС] 3
Wow, я конечно догадывалась что у std такой богатый набор решений, но не настолько!

Добавлено через 48 секунд
круто написано, спасибо
0
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 21:13 4
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Эксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.03.2015, 22:07 5
Цитата Сообщение от Kant Посмотреть сообщение
Как отвечать определенному человеку?
Щелкнуть по его нику слева над аватаром и статусом.

Добавлено через 24 минуты
Цитата Сообщение от Kant Посмотреть сообщение
l.state << l.state
Здесь наверное предполагалось что-то другое.
1
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 23:59 6
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  [ТС] 7
Отличный способ, правда подходит только для упорядоченных массивов
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.03.2015, 18:55 8
Цитата Сообщение от gutalin Посмотреть сообщение
Отличный способ, правда подходит только для упорядоченных массивов
Определите operator< для Object и вызовите std::sort перед merge.
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
16.03.2015, 19:30  [ТС] 9
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  [ТС] 10
а можно ли без сортировки сделать? просто сортировка меняет правильную последовательность объектов местами, это неправильно
0
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
22.04.2015, 15:22 11
gutalin, приведи пример.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.04.2015, 15:35 12
Цитата Сообщение от gutalin Посмотреть сообщение
просто сортировка меняет правильную последовательность объектов местами, это неправильно
Вы наверное имеете в виду устойчивую сортировку. Если брать готовое решение, то это std::stable_sort. std::sort - неустойчивая сортировка.
0
22.04.2015, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2015, 15:35
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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