У меня есть указатель на вектор. Теперь, как я могу прочитать содержимое вектора через указатель? Я знаю, что это основной вопрос, но я не могу найти ответ для него. (С++)
Указатель на вектор
Ответ 1
Есть много решений, здесь несколько я придумал:
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!)
}
Ответ 2
Доступ к нему, как и любое другое значение указателя:
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;
}
Ответ 3
vector<int> v;
v.push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;
Ответ 4
У вас есть указатель на вектор, потому что, как вы его закодировали? Вы можете пересмотреть это и использовать ссылку (возможно, const). Например:
#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);
}
В то время как это допустимая программа, общий стиль С++ должен передавать вектор по ссылке, а не по указателю. Это будет так же эффективно, но тогда вам не придется иметь дело с возможными нулевыми указателями и распределением/очисткой памяти и т.д. Используйте ссылку на 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, но она не будет копировать совершенно новое значение, поскольку оно передается по ссылке. Поэтому он так же эффективен, как и передача указателем, и вы можете использовать его как нормальное значение, вместо того, чтобы определять, как использовать его в качестве указателя или его разыменовать.
Ответ 5
Вы можете напрямую обращаться к методам итератора:
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];
Ответ 6
Есть много решений. Например, вы можете использовать метод at()
.
* Я предположил, что вы ищете эквивалент оператора []
.
Ответ 7
Самый простой способ использовать его, поскольку массив использует член vector::data()
.