Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Проблема с объединением 2-х векторов в STL
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ary ary вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.08.2004
По умолчанию Проблема с объединением 2-х векторов в STL - 09.04.2006, 16:32

Пытаюсь объединить 2 неотсортированных вектора:
{6,2,5,4}и {3,44,7,99}
записывая их в 3-й вектор-т.е. ожидаемый результат:
{6,2,5,4,3,44,7,99}
Конечно,можно бы сделать через двойное copy,
но просто хочется понять:
почему set_union (или merge) не работают,и получается так:
{3,6,2,5,4,44,7,99}
Код прилагается:
Код:
void main()
{
  
  int a[]={6,2,5,4};
  vector <int> v1(a,a+4);
  int b[]={3,44,7,99};
  vector<int> v2(b,b+4);

  vector<int> v3;
  set_union(v1.begin(), v1.end(), 
  v2.begin(), v2.end(), back_inserter(v3));

  for(it=v3.begin();it!=v3.end();it++)
    cout<<*it;
Заранее спасибо за ответ.
Ответить с цитированием
  (#2 (permalink)) Старый
c++ c++ вне форума
Member
 
Сообщений: 962
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.12.2003
По умолчанию 09.04.2006, 21:55

Цитата:
Originally posted by MSDN
[b]Unites all of the elements that belong to at least one of two sorted source ranges into a single, sorted destination range, where the ordering criterion may be specified by a binary predicate.
Т.е. нужно предварительно отсторировать векторы.
1. Как это через двойное copy?
2. Что такое объект c?
Ответить с цитированием
  (#3 (permalink)) Старый
ary ary вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.08.2004
По умолчанию 09.04.2006, 22:36

Насчет объекта c-исправил ошибку,
это разумеется v3- конечный вектор.
Двойное копирование-это когда так:
Код:
copy(v1.begin(),v1.end(),inserter(v2,v2.begin()));
copy(v2.begin(),v2.end(),v3.begin());
Тогда все работает.
Вопрос-можно ли это сделать одним действием, а не двумя- для двух неотсортированных векторов?
Ответить с цитированием
  (#4 (permalink)) Старый
c++ c++ вне форума
Member
 
Сообщений: 962
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.12.2003
По умолчанию 09.04.2006, 22:45

Я не очень понимаю задачу. Есть два вектора: v1 и v2. Нужно построить вектор v3, отличный от предыдущих двух, который является объединением элементов v1 и v2. Так?
Если так, то, даже используя какие-то библиотечные функции, как ты себе представляешь способ, в котором можно избежать копирования как из v1, так и из v2?
Ответить с цитированием
  (#5 (permalink)) Старый
Rockie Rockie вне форума
Member
 
Сообщений: 126
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2005
По умолчанию 11.04.2006, 01:42

у меня в хелпе по STL-ю лежит такое определение:

set_union создаёт сортированное объединение элементов из двух диапазонов. Он возвращает конец созданного диапазона. set_union устойчив, то есть, если элемент присутствует в обоих диапазонах, он копируется из первого диапазона. Выполняется максимально ((last1 - first1) + (last2 - first2)) * 2 - 1 сравнений. Результат set_union не определён, если возникающий в результате диапазон перекрывается с любым из первоначальных диапазонов.

template <class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1,
InputIterator1 last1, InputIterator2 first2,
InputIterator2 last2, OutputIterator result);

template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_intersection(InputIterator1 first1,
InputIterator1 last1, InputIterator2 first2,
InputIterator2 last2, OutputIterator result,
Compare comp);

там же валяется такой пример:

Код:
#include <stl.h>
#include <iostream.h>

int v1[3] = { 13, 18, 23 };
int v2[4] = { 10, 13, 17, 23 };
int result[7] = { 0, 0, 0, 0, 0, 0, 0 };

int main ()
{
  set_union (v1, v1 + 3, v2, v2 + 4, result);
  for (int i = 0; i < 7; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}
и на всякий случай пример из CBuilder-а:

Код:
//
// set_unin.cpp
//
#include <algorithm>
#include <set>
#include <iostream>
using namespace std;
int main()
 {
//Initialize some sets
int a2[6]  = {2,4,6,8,10,12};
int a3[4]  = {3,5,7,8};
set<int, less<int> >  even(a2+0, a2+6), 
    result, small(a3+0,a3+4);
//Create an insert_iterator for result
insert_iterator<set<int, less<int> > > 
    res_ins(result, result.begin());
//Demonstrate set_union
cout << "The result of:" << endl << "{";
copy(small.begin(),small.end(),

     ostream_iterator<int,char>(cout," "));
cout << "} union {";
copy(even.begin(),even.end(),
     ostream_iterator<int,char>(cout," "));
cout << "} =" << endl << "{";
set_union(small.begin(), small.end(),
          even.begin(), even.end(), res_ins);
copy(result.begin(),result.end(),
     ostream_iterator<int,char>(cout," "));
cout << "}" << endl << endl;
return 0;
 }
Program Output

The result of:
{3 5 7 8 } union {2 4 6 8 10 12 } =
{2 3 4 5 6 7 8 10 12 }
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу для вычисления элементов векторов Х,R и матрицы А Bjac@ Pascal 4 19.06.2011 12:14
Проблема с Проблема с Java Virtual Machine, Нужна помощь KBeHTuH Любые вопросы от новичков 0 06.12.2010 22:29
Разработать класс для моделирования объектов-векторов pont90 Lisp 6 07.05.2010 00:30
Таблица решений алгоритм векторов перехода ЛИЛИ Микроконтроллеры 17 25.12.2007 21:43
Преобразование векторов с помощью матрицы imported__Sergey_ Программирование графики 2 30.08.2007 14:56
Организация метода сложения и вычитания векторов Блудливый кот Visual C++ 1 19.12.2005 14:11
Поиск собственныех векторов и значений методом Данилевского imported_kisa Pascal 4 06.12.2005 12:27
Как разобраться с объединением списков и условием deZZa Вопросы начинающих программистов 0 24.10.2005 10:56
Обработка векторов stanley Prolog 1 15.01.2005 21:40
Написать функцию которая находит результат сложения N заданных векторов Ромыч Pascal 5 23.11.2003 22:58
Переопределения векторов прерываний Andrey_K Visual C++ 2 05.08.2003 02:37
Создание задачи при помощи векторов #include <vector> Spider Вопросы начинающих программистов 1 06.03.2003 13:07



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов