Как иметь вектор byvalue и использовать вектор указателей в сочетании?

StackOverflow https://stackoverflow.com/questions/1609121

Вопрос

У меня есть несколько векторов объектов класса А.:

 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, а затем отсортировать его (или вы могли бы использовать сортированный контейнер и сортировать по мере вставки элементов).Вам нужно будет определить свой собственный оператор сортировки, который разыменовывает указатели и применяет любой алгоритм сортировки к самим целевым объектам.

Помогает ли это вам?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top