Nano Hash - криптовалюты, майнинг, программирование

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

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

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

так далее

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

 std::vector<A *> *arranged;

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

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

ty,

Джо


Ответы:


1

Вы можете написать свой собственный компаратор. В этом случае компаратор будет работать на 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;
}
22.10.2009
  • привет, спасибо за ответ, поэтому, когда я добавляю указатель на элемент в векторе, он будет не копировать, а просто указывать? Моя проблема в понимании этого заключается в том, что вектор имеет стек, а не кучу, так как же внешняя функция может указывать на него? или я просто путаю понятия? когда вы push_back что-то внутри вектора‹A› создает это снова, но в куче? 22.10.2009
  • При отправке вещей в vec' when are pushing the addresses of the variables in first` и second. При сортировке vec', the values will be compared but the pointers them selves will be swapped in vec'. 22.10.2009
  • Спасибо, у меня все еще есть некоторые вопросы относительно hean и stack, но я буду изучать их в Google. Отметил ваш ответ и поставил вам балл, спасибо! 22.10.2009
  • std::vector создает динамический массив в куче. Когда вы вставляете что-то в него, он копирует этот объект и добавляет его в свой внутренний массив. Сам векторный объект будет в стеке, что означает размер, емкость и указатель на внутренний массив. Сам внутренний массив будет в куче. 22.10.2009

  • 2

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

    Вам это помогает?

    22.10.2009
  • это помогло, но вектор не останется живым в конце области видимости, это указатель, как я описал, но только потому, что он будет использоваться какой-то другой функцией, а в конце основной функции я его удалю 22.10.2009
  • Действительное понимание того, что такое указатели, время жизни объекта и т. д., имеет решающее значение для успешного программирования на C++. Наличие контейнера указателей требует, чтобы объекты, на которые они указывают, оставались действительными в течение всего времени, на которое они указывают! Таким образом, source1-3 не могут быть уничтожены (выйти за рамки), и их содержимое не может измениться (вы не можете вставлять элементы или изменять их порядок), иначе указатели в составном будут указывать на случайную информацию (вместо объектов, которые вы хотели их к). Я настоятельно рекомендую серию статей Scott Myers Effective C++, если вы еще не читали ее. ;) 23.10.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..