在 C + + 中,如何从指向向量的指针访问向量的内容?

我有一个指向向量的指针。现在,我如何通过指针读取向量的内容?

312317 次浏览

有很多解决方案。例如,你可以使用 at()方法。

* 我假设你在寻找一个等价于 []的运算符。

像访问其他指针值一样访问它:

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;
}
vector<int> v;
v.push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;

您可以直接访问迭代器方法:

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];

有很多解决方案,以下是我想到的一些:

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!)
}

使用它作为数组最简单的方法是使用 vector::data()成员。

你有一个指向向量的指针,因为你是这样编码的吗?您可能需要重新考虑这一点,并使用(可能是常量)引用。例如:

#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 + + 风格是通过引用而不是通过指针传递向量。这将同样有效,但是您不必处理可能的空指针和内存分配/清理等问题。如果不打算修改向量,则使用常量引用; 如果需要修改,则使用非常量引用。

以下是上述程序的参考版本:

#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,但它不会复制一个全新的值,因为它是通过引用传递的。因此,它和通过指针传递一样有效,您可以将它作为一个普通值使用,而不必弄清楚如何将它用作指针或不得不取消对它的引用。

vector <int> numbers {10,20,30,40};
vector <int> *ptr {nullptr};


ptr = &numbers;


for(auto num: *ptr){
cout << num << endl;
}




cout << (*ptr).at(2) << endl; // 20


cout << "-------" << endl;


cout << ptr -> at(2) << endl; // 20