Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
gutalin
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
1

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

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

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

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

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

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

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

Сложение элементов двух векторов с записью в третий
Есть код функции (не дописанная), которая получает в качестве аргументов 2 вектора произвольных...

11
Melg
541 / 162 / 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
gutalin
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
15.03.2015, 20:36  [ТС] 3
Wow, я конечно догадывалась что у std такой богатый набор решений, но не настолько!

Добавлено через 48 секунд
круто написано, спасибо
0
Kant
33 / 33 / 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
MrGluck
Форумчанин
Эксперт CЭксперт С++
8142 / 4993 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
15.03.2015, 22:07 5
Цитата Сообщение от Kant Посмотреть сообщение
Как отвечать определенному человеку?
Щелкнуть по его нику слева над аватаром и статусом.

Добавлено через 24 минуты
Цитата Сообщение от Kant Посмотреть сообщение
l.state << l.state
Здесь наверное предполагалось что-то другое.
1
Kant
33 / 33 / 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
gutalin
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
16.03.2015, 18:54  [ТС] 7
Отличный способ, правда подходит только для упорядоченных массивов
0
MrGluck
Форумчанин
Эксперт CЭксперт С++
8142 / 4993 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
16.03.2015, 18:55 8
Цитата Сообщение от gutalin Посмотреть сообщение
Отличный способ, правда подходит только для упорядоченных массивов
Определите operator< для Object и вызовите std::sort перед merge.
0
gutalin
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
gutalin
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 40
22.04.2015, 10:43  [ТС] 10
а можно ли без сортировки сделать? просто сортировка меняет правильную последовательность объектов местами, это неправильно
0
Kant
33 / 33 / 18
Регистрация: 15.05.2013
Сообщений: 236
22.04.2015, 15:22 11
gutalin, приведи пример.
0
MrGluck
Форумчанин
Эксперт CЭксперт С++
8142 / 4993 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
22.04.2015, 15:35 12
Цитата Сообщение от gutalin Посмотреть сообщение
просто сортировка меняет правильную последовательность объектов местами, это неправильно
Вы наверное имеете в виду устойчивую сортировку. Если брать готовое решение, то это std::stable_sort. std::sort - неустойчивая сортировка.
0
22.04.2015, 15:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2015, 15:35

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

Сложение двух векторов и запись результата в третий вектор
Программа заполняет 2 вектора типа float значениями. После чего вектора складываются и результат...

Слияние 2х векторов из 2х файлов
Помогите написать программу Пожалуйста .Программа создает два вектора a и b из двух файлов. Функция...

Слияние двух файлов по алгоритму: цифра вставляется после двух символов
#include &lt;iostream&gt; #include &lt;io.h&gt; #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include &lt;string.h&gt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.