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

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

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

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

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

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Вывод вектора указателей - C++
Всем доброго времени суток. Есть такая проблема, пытаюсь написать шаблонный класс для древовидной структуры: template &lt;class T&gt; ...

Удаление указателей из вектора - C++
Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор хранящий указатели на объекты, ежли я вызову erase насколько...

Сохранение в файл вектора указателей - C++
Здравствуйте. Помогите, пожалуйста, советами - как правильно сохранить на диск четыре вектора указателей на произвольные типы. Дело в...

Запись вектора строк в массив указателей на тип char - C++
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс. 4-е изд. Задание: 1) Напишите программу, читающую...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 17:20 #2
У вас есть конструктор копирования?
0
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
19.11.2012, 17:33  [ТС] #3
Цитата Сообщение от I.M. Посмотреть сообщение
У вас есть конструктор копирования?
У класса нет, но он есть у вектора и он срабатывает (я же вектор копирую, а не класс)...
Но из-за того, что первый вектор - указатели, то и копируются указатели...
А нужно сделать копию структуры.
Хм... хотя,если подумать, то конструктор копирования будет нужен. Но это уже другое дело и проблем не должно вызвать.
Вопрос именно, как скопировать вектор указателей, что бы получить вектор, при работе с которым исходные данные не менялись бы.
0
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 секунд
Как вы определили, что ваш второй вариант не работает?
0
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
19.11.2012, 17:54  [ТС] #5
Цитата Сообщение от I.M. Посмотреть сообщение
Как вы определили, что ваш второй вариант не работает?
Поменял кое-что в новом векторе, изменения затронули старый.
0
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;
}
решение - конструктор копирования
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 18:00
Привет! Вот еще темы с ответами:

Как создать копию векторного массива? - C++
То есть... у меня есть векторный массив. Я хочу создать еще один векторный массив точно такой же как тот. Можно ли сразу приравнять массивы...

Создать полную копию исходного дерева и проверить узел - C++
У меня есть дерево выражения(двоичное дерево). По алгоритму происходит следующее: 1. Проверяю каждый узел дерева. 2. Если с ним...

Как создать копию объекта на который указывает указатель - C++
У меня есть указатель класс Student, который хранит информацию о студентах(имя, фамилию, телефон) в строках в стиле Си, то есть private...

Как создать копию объекта, зная его указатель? - C++
Здравствуйте, существует следующая проблема. В своей программе я рисую график используя класс QwtPolarPlot. По нажатию на график, должно...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.11.2012, 18:00
Ответ Создать тему
Опции темы

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