Указатель std::vector std::vector

быстрый вопрос :

Можно ли сделать указатель, который может ссылаться на std::vector<std::vector<int> >или std::vector<std::vector<double>>?

Спасибо


person Matthieu Riegler    schedule 18.01.2012    source источник
comment
Что бы вы хотели сделать с этим указателем? то есть, в каком контексте было бы полезно иметь указатель, который может указывать на std::vector<std::vector<int> > или std::vector<std::vector<double> >?   -  person Oliver Charlesworth    schedule 18.01.2012
comment
Вы имеете в виду указатель, который может указывать на любой из них?   -  person MikMik    schedule 18.01.2012
comment
затем создайте объект-оболочку, содержащий double или int. вот так: vector<vector<IntOrDouble>> *p   -  person TeaOverflow    schedule 18.01.2012
comment
Как бы вы использовали такой указатель? Можете ли вы показать пример?   -  person n. 1.8e9-where's-my-share m.    schedule 18.01.2012
comment
Для каких целей вы планируете использовать такой указатель?   -  person Sergey Kalinichenko    schedule 18.01.2012


Ответы (4)


Если использование повышения является вариантом, вы можете использовать boost:variant . Технически это не указатель, а типобезопасный контейнер с одним элементом, но он должен иметь возможность выполнять свою работу, не прибегая к способу использования «больших орудий» с использованием void*.

person Sergey Kalinichenko    schedule 18.01.2012

Если вам нужно, вы можете использовать конструкцию объединения

union intordouble
{
    int x;
    double d;
};

int main()
{
    vector<intordouble> v;
    return 0;
}

По сути, вектор всегда является объединением intordouble, поэтому у вас есть указатель на него, и вам не нужно различать его. Пожалуйста, взгляните на Хорошая практика использования союзы в C++?

person parapura rajkumar    schedule 18.01.2012
comment
есть ли противопоказания к их использованию? - person Matthieu Riegler; 18.01.2012
comment
Вы не можете использовать этот союз, не зная, какой тип в данный момент в нем находится. Если все элементы в любом векторе будут одного типа, вы можете добавить к вектору дополнительный элемент данных, чтобы указать, какой тип он содержит. Если вы хотите хранить разнородные элементы в одном массиве, вам нужно будет использовать (или заново изобрести) boost::variant. - person Mike Seymour; 18.01.2012

<bad_guy_mode>

typedef std::vector<std::vector<int>>* vvi_ptr;
typedef std::vector<std::vector<double>>* vvd_ptr;

union int_or_double_vecs{
  vvi_ptr int_vector;
  vvd_ptr double_vector;
};

(Обратите внимание, что одновременно доступен только один член, и это только тот, который вы настроили последним.)

</bad_guy_mode>

person Xeo    schedule 18.01.2012

void* может указывать на любой из них, но перед использованием должен быть приведен к правильному типу.

Типизированный указатель может указывать только на указанный тип, включая типы, которые унаследованы от него. Различные специализации vector представляют собой разные типы и не имеют общего базового класса, поэтому ни один типизированный указатель не может указывать на оба из них.

Если вы считаете, что это действительно то, что вам нужно сделать, вы можете рассмотреть возможность использования размеченного союза, такого как boost::variant для хранения различных типов указателей.

person Mike Seymour    schedule 18.01.2012