Как получить вектор byvalue и использовать вектор указателей вместе? - PullRequest
1 голос
/ 22 октября 2009

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

 std::vector<A> *V1;
 std::vector<A> *V2;

и т.д.

есть функция с вектором указателей A:

 std::vector<A *> *arranged;

что мне нужно сделать, это поместить векторы из V1, V2 и т. Д. Внутри, не разрушая их в конце, поэтому я подумал, что вектор указателей на эти объекты ... это возможно? если да, можете ли вы привести пример итерации с переменной V1 и добавить указатели этих объектов в упорядоченные?

представьте себе, что вам временно нужно отсортировать 3 вектора объектов в один вектор, но вы не хотите портить память о 3 векторах.

ти

Джо

Ответы [ 2 ]

2 голосов
/ 22 октября 2009

Вы можете написать свой собственный компаратор. В этом случае компаратор будет работать на A*. Простой пример использования int type:

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;
}
0 голосов
/ 22 октября 2009

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

Это тебе помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...