Как получить доступ к содержимому вектора из указателя на вектор в C ++? - PullRequest
51 голосов
/ 04 августа 2011

У меня есть указатель на вектор. Теперь, как я могу прочитать содержимое вектора через указатель?

Ответы [ 7 ]

71 голосов
/ 04 августа 2011

Есть много решений, вот несколько, которые я придумал:

int main(int nArgs, char ** vArgs)
{
    vector<int> *v = new vector<int>(10);
    v->at(2); //Retrieve using pointer to member
    v->operator[](2); //Retrieve using pointer to operator member
    v->size(); //Retrieve size
    vector<int> &vr = *v; //Create a reference
    vr[2]; //Normal access through reference
    delete &vr; //Delete the reference. You could do the same with
                //a pointer (but not both!)
}
16 голосов
/ 04 августа 2011

Доступ к нему, как и к любому другому значению указателя:

std::vector<int>* v = new std::vector<int>();

v->push_back(0);
v->push_back(12);
v->push_back(1);

int twelve = v->at(1);
int one = (*v)[2];

// iterate it
for(std::vector<int>::const_iterator cit = v->begin(), e = v->end; 
    cit != e;  ++cit)
{
    int value = *cit;
}

// or, more perversely
for(int x = 0; x < v->size(); ++x)
{
    int value = (*v)[x];
}

// Or -- with C++ 11 support
for(auto i : *v)
{
   int value = i;
}
15 голосов
/ 04 августа 2011

У вас есть указатель на вектор, потому что вы так его кодировали? Вы можете пересмотреть это и использовать (возможно, постоянную) ссылку. Например:

#include <iostream>
#include <vector>

using namespace std;

void foo(vector<int>* a)
{
    cout << a->at(0) << a->at(1) << a->at(2) << endl;
    // expected result is "123"
}

int main()
{
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    foo(&a);
}

Хотя это допустимая программа, общий стиль C ++ - передавать вектор по ссылке, а не по указателю. Это будет столь же эффективно, но тогда вам не придется иметь дело с, возможно, нулевыми указателями, распределением / очисткой памяти и т. Д. Используйте ссылку const, если вы не собираетесь изменять вектор, и ссылку не const, если вам нужно внести изменения.

Вот справочная версия вышеуказанной программы:

#include <iostream>
#include <vector>

using namespace std;

void foo(const vector<int>& a)
{
    cout << a[0] << a[1] << a[2] << endl;
    // expected result is "123"
}

int main()
{
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    foo(a);
}

Как вы можете видеть, вся информация, содержащаяся в a, будет передана функции foo, но она не будет копировать совершенно новое значение, так как оно передается по ссылке. Поэтому он так же эффективен, как и передача по указателю, и вы можете использовать его как обычное значение, вместо того, чтобы разбираться, как использовать его в качестве указателя или как разыменовывать его.

11 голосов
/ 04 августа 2011
vector<int> v;
v.push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;
6 голосов
/ 04 августа 2011

Вы можете получить доступ к методам итератора напрямую:

std::vector<int> *intVec;
std::vector<int>::iterator it;

for( it = intVec->begin(); it != intVec->end(); ++it )
{
}

Если вам нужен оператор доступа к массиву, вам придется снять указатель с ссылки. Например:

std::vector<int> *intVec;

int val = (*intVec)[0];
2 голосов
/ 04 августа 2011

Есть много решений. Например, вы можете использовать метод at().

* Я предположил, что вы ищете эквивалент оператора [].

0 голосов
/ 04 августа 2011

Самый простой способ использовать его как массив - использовать vector::data() member.

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