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

Создать копию вектора указателей - C++

Восстановить пароль Регистрация
 
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
19.11.2012, 17:12     Создать копию вектора указателей #1
Есть вектор указателей на мой класс:
C++
1
vector <TreeSet*> tree_set_list;
Каждый класс содержит еще вектора с другими классами... в общем это довольно большая структура.
Хочу сделать копию данного вектора, чтоб ы с ней можно было работать, не меняя данных в основном векторе.
Вот это действие:
C++
1
vector<TreeSet*> tmp_copy_set(tree_set_list);
Ожидаемо не дает нужного результата - работа с вектором меняет значения в главном.
Больше того, дополнительные извращения не приносят пользу:
C++
1
2
3
vector<TreeSet> set_list_to_save;
    for (size_t i = 0; i < tmp_copy_set.size(); i++)
         set_list_to_save.push_back(*tmp_copy_set[i]);
Что-то я подзабыл указатели, видимо, но отобрать у вектора данные, а не указатели никак не выходит...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 17:20     Создать копию вектора указателей #2
У вас есть конструктор копирования?
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
19.11.2012, 17:33  [ТС]     Создать копию вектора указателей #3
Цитата Сообщение от I.M. Посмотреть сообщение
У вас есть конструктор копирования?
У класса нет, но он есть у вектора и он срабатывает (я же вектор копирую, а не класс)...
Но из-за того, что первый вектор - указатели, то и копируются указатели...
А нужно сделать копию структуры.
Хм... хотя,если подумать, то конструктор копирования будет нужен. Но это уже другое дело и проблем не должно вызвать.
Вопрос именно, как скопировать вектор указателей, что бы получить вектор, при работе с которым исходные данные не менялись бы.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 17:42     Создать копию вектора указателей #4
C++
1
2
3
vector<TreeSet> set_list_to_save;
    for (size_t i = 0; i < tmp_copy_set.size(); i++)
         set_list_to_save.push_back(TreeSet(*tmp_copy_set[i]));
Наверное, так.
Мне не приходит в голову как одной строкой скопировать вектор указателей в другой вектор, причем чтобы указатели указывали на копии объектов

Добавлено через 4 минуты
Хотя вот это
C++
1
2
3
vector<TreeSet> set_list_to_save;
    for (size_t i = 0; i < tmp_copy_set.size(); i++)
         set_list_to_save.push_back(*tmp_copy_set[i]);
тоже должно было работать

Добавлено через 58 секунд
Как вы определили, что ваш второй вариант не работает?
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
19.11.2012, 17:54  [ТС]     Создать копию вектора указателей #5
Цитата Сообщение от I.M. Посмотреть сообщение
Как вы определили, что ваш второй вариант не работает?
Поменял кое-что в новом векторе, изменения затронули старый.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 18:00     Создать копию вектора указателей #6
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
#include <iostream>
#include <vector>
 
class A
{
public:
   int a;
};
 
int main()
{
   std::vector<A*> v1;
   std::vector<A> v2;
 
   v1.push_back(new A());
   v1[0]->a = 17;
   v2.push_back(*v1[0]);
   v2[0].a = 42;
 
   std::cout << v1[0]->a << " " << v2[0].a << std::endl;
 
   system("pause");
   return 0;
}
Простейший пример. Должно быть все ок

Добавлено через 3 минуты
А вот пример, показывающий, почему у вас не ок
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
#include <iostream>
#include <vector>
 
class A
{
public:
   int* a;
};
 
int main()
{
   std::vector<A*> v1;
   std::vector<A> v2;
 
   v1.push_back(new A());
   v1[0]->a = new int(17);
   v2.push_back(*v1[0]);
   *(v2[0].a) = 42;
 
   std::cout << *(v1[0]->a) << " " << *(v2[0].a) << std::endl;
 
   system("pause");
   return 0;
}
решение - конструктор копирования
Yandex
Объявления
19.11.2012, 18:00     Создать копию вектора указателей
Ответ Создать тему
Опции темы

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