web-dev-qa-db-ja.com

C ++でベクターへのポインターからベクターのコンテンツにアクセスする方法は?

ベクトルへのポインターがあります。さて、ポインターを介してベクターの内容を読み取るにはどうすればよいですか?

51
Pavan Dittakavi

多くの解決策がありますが、ここに私が思いついたいくつかがあります:

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!)
}
72
Seb Holzapfel

他のポインター値と同様にアクセスします。

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;
}
17
Chad

それがあなたがそれをコーディングした方法だから、あなたはベクトルへのポインタを持っていますか?これを再検討し、(おそらく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);
}

これは有効なプログラムですが、一般的なC++スタイルでは、ポインターではなく参照によってベクトルを渡します。これは同じくらい効率的ですが、nullポインターやメモリの割り当て/クリーンアップなどを処理する必要はありません。ベクトルを変更しない場合は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に渡されますが、参照によって渡されるため、まったく新しい値はコピーされません。したがって、ポインターで渡すのと同じくらい効率的であり、ポインターとして使用する方法を理解したり、逆参照したりする必要はなく、通常の値として使用できます。

16
vector<int> v;
v.Push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;
11
Mark Ransom

イテレータメソッドに直接アクセスできます。

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
Jon Benedicto

多くの解決策があります。たとえば、at()メソッドを使用できます。

* []演算子に相当するものを探していると仮定しました。

2
eugene_che