Как иметь вектор byvalue и использовать вектор указателей в сочетании?
Вопрос
У меня есть несколько векторов объектов класса А.:
std::vector<A> *V1;
std::vector<A> *V2;
и т.д.
существует функция с вектором указателей на:
std::vector<A *> *arranged;
что мне нужно сделать, это поместить векторы из V1, V2 и т.д. внутрь упорядоченных, не уничтожая их в конце, поэтому я подумал, что вектор указателей на эти объекты...возможно ли это?если да, можете ли вы привести мне пример итерации с переменной V1 и добавить указатели на эти объекты в arranged?
представьте, что вам временно нужно отсортировать 3 вектора объектов в один вектор, но вы не хотите портить память о 3 векторах.
тай,
Джо
Решение
Вы могли бы написать свой собственный компаратор.В этом случае компаратор будет работать на A*
.Простой пример использования int
Тип:
void fun(vector<int*>* vec)
{
/////////
}
bool comp(int* lhs, int* rhs)
{
return *lhs < *rhs;
}
int main()
{
vector<int> first, second;
vector<int*> vec;
for(vector<int>::size_type i = 0; i < first.size(); ++i)
vec.push_back(&first[i]);
for(vector<int>::size_type i = 0; i < second.size(); ++i)
vec.push_back(&second[i]);
// write your own comparator! provided above: comp
sort(vec.begin(), vec.end(), comp);
fun(&vec);
return 0;
}
Другие советы
Если я вас правильно понимаю - у вас есть несколько векторов, содержащих некоторый тип объекта (A), и вы хотите создать новый вектор, содержащий композицию всех элементов других векторов без фактического копирования объектов или иного нарушения их векторов-владельцев каким-либо образом?
Первый:существует ли определенно срок службы нового составного вектора таким образом, что ни один из его исходных векторов не изменится?Это:вы не можете просто использовать необработанные указатели на исходные векторы из вашего составного вектора, если эти указатели будут признаны недействительными в течение срока службы вашего составного вектора.
Если ответ на это - что угодно, кроме "определенно, указатели останутся действительными", тогда вам нужно рассмотреть возможность использования общих указателей или чего-то подобного, чтобы изменение исходных векторов не оставило ваш составной вектор в недопустимом состоянии (т. Е.не оставляйте его указывающим на случайную память).
Предполагая, что исходные векторы останутся неизменными с точки зрения их собственного содержимого в течение срока службы вашего композита, тогда простой ответ - "Да".
vector<A> source1;
vector<A> source2;
vector<A> source3;
vector<const A*> composite; // this is a sorted vector of the above vectors' contents (by pointer)
Для составного вектора вам нужно было бы поместить в него содержимое (путем копирования) source1-3, а затем отсортировать его (или вы могли бы использовать сортированный контейнер и сортировать по мере вставки элементов).Вам нужно будет определить свой собственный оператор сортировки, который разыменовывает указатели и применяет любой алгоритм сортировки к самим целевым объектам.
Помогает ли это вам?