C ++, как сделать два вектора, один с данными, другие точки и только для чтения - PullRequest
1 голос
/ 10 октября 2010

В C ++ у меня есть 2 вектора STL A и V.A имеет данные и может их изменять, V только указывает на данные, но только для чтения и не может их изменять.Таким образом, если эти два вектора находятся внутри класса, то синтаксис будет

  1. Определение переменных
  2. назначение A ссылки в V
  3. get_A ()и get_V () будет ли он возвращать ссылку или указатель?

Кроме того, если у меня есть другие нормальные векторы, такие как A, B, C и D, могу ли я«вставить» их ссылки в V, чтобы V мог видеть их всех по одному?Для оформления V.size() будет равно A.size() + B.size() + C.size().


Извините за путаницу, думаю, я задал вопрос неправильно

Ответы [ 2 ]

1 голос
/ 10 октября 2010
  1. Векторы будут объявлены как

    vector<Data> A;
    vector<const Data *> V;
    

    (Обратите внимание, что V не может быть вектором const Data &, поскольку ссылки не являются назначаемыми, а для вектора требуется тип назначаемого шаблона.)

  2. Назначение ссылки из A в V будет выглядеть так:

    V[i] = &A[i];
    
  3. Я не уверен, что вы подразумеваете под get_A и get_V. Мое лучшее предположение заключается в том, что вы ссылаетесь на результаты оператора [] на A и V. A[i] возвращает ссылку на данные, то есть Data&. V[i] технически возвращает ссылку на указатель на константные данные, т. Е. const Data * &, но фактически вы бы использовали его в качестве указателя, т. Е. const Data *.

Относительно вопроса об A, B и C: если они являются векторами одного типа и не меняют размер, вы можете настроить V так, чтобы он содержал указатели на элементы в каждом из них. Но если они изменяют размер, то добавление элемента, скажем, A, после установки V, будет означать, что вам нужно будет вставить указатель на новый элемент A в правильное смещение V, что возможно, но выглядит как хлопот.

Быстрый пример настройки такого V будет выглядеть так:

vector<Data const *> V;
for (size_t i = 0; i < A.size(); ++i) { V.push_back(&A[i]); }
for (size_t i = 0; i < B.size(); ++i) { V.push_back(&B[i]); }
for (size_t i = 0; i < C.size(); ++i) { V.push_back(&C[i]); }
0 голосов
/ 10 октября 2010

Я полагаю, что вы описываете что-то вроде const псевдонима для вектора данных. Я хочу сказать, что вам нужно работать с константной ссылкой на вектор A.

Пример (совершенно неожиданно, но достаточно хорошо описывает мое предложение и понимание ситуации):

class someClass
{
public:
    const std::vector & V() const
    {
        return A;
    }
private:
    std::vector<int> A;
};

Из того, что я получил от const ness, это «защищает» A, показывая только версию const, когда кто-то «обращается» к вектору через someClass::V().

...