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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
#1

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

19.11.2012, 17:12. Просмотров 715. Ответов 5
Метки нет (Все метки)

Есть вектор указателей на мой класс:
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]);
Что-то я подзабыл указатели, видимо, но отобрать у вектора данные, а не указатели никак не выходит...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 17:12     Создать копию вектора указателей
Посмотрите здесь:

Дан файл произвольного типа. Создать его копию с новым именем. C++
C++ Создать копию объекта производного класса зная указатель на базовый
Создать полную копию исходного дерева и проверить узел C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
Удаление указателей из вектора C++
C++ Как создать копию объекта, зная его указатель?
C++ как создать копию объекта, на который ссылается итератор?
Запись вектора строк в массив указателей на тип char C++
C++ Сохранение в файл вектора указателей
Вывод вектора указателей C++
Как создать копию векторного массива? C++
Как создать копию объекта на который указывает указатель C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Создать копию вектора указателей
Ответ Создать тему
Опции темы

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