2011-08-04 301 views
37

我有一個指向矢量的指針。現在,我怎樣才能通過指針讀取矢量的內容?我知道這是一個基本問題,但我無法找到同樣的答案。(C++)指向矢量的指針

+7

到目前爲止您嘗試過什麼?你能提供一些代碼,所以我們可以具體談一談嗎? – Nate

+3

您確定要使用指向矢量的指針嗎?使用引用可能更有意義。看到我的帖子下面。 –

回答

51

解決方法有很多,這裏有幾個我想出來的:

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

引用部分是壞建議,因爲'new'可以返回0. –

+0

@Don Reba - 不是真的;在大多數編譯器上引發異常:http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case – Schnommus

+0

另外,如果'new' **確實返回0,**所有**指針上的操作都不好,不僅僅是參考初始化。 – Schnommus

2

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

*我以爲你找一個相當於[]的操作符。

+0

但如何知道向量中元素的數量? – Pavan

+1

@ user815961'v-> size()'返回向量 – Praetorian

12

訪問它像任何其他指針值:

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; 
} 
+1

中向上的元素數目,就像「任何其他指針」一樣。我不明白這個問題。你有一個指針,所以你使用'thing-> member'而不是'thing.member',這是唯一的區別(在99%的情況下,等等) –

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

最簡單的方式來使用它作爲陣列是使用vector::data()成員。

+1

您使用向量的原因是爲了抽象出背後的底層實現(連續數組)。這違背了面向對象的原則,更不用說效率極低了,因爲當你可以使用vec-> at(index)的時候,你正在分配一個全新的n數組。更何況,這與原始海報的問題完全沒有關係,因爲你沒有在任何地方使用指向矢量的指針。 –

+0

我只是給出了一個例子,如果我們想知道底層類型,我們可以使用vector :: value_type。但它是靜態解釋的。我想傳達的觀點是data()是獲取底層指針的成員。這就是他的問題所在。 – sarat

+0

不,問題是'vector'是否可以通過指針讀取。我沒有看到OP中的任何內容,表明比這更深的東西。 –

11

你有一個指向矢量的指針,因爲這就是你編碼的方式嗎?您可能需要重新考慮這一點並使用(可能是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++風格是通過引用而不是指針傳遞向量。這將會同樣有效,但是你不需要處理可能的空指針和內存分配/清理等。如果你不打算修改向量,那麼使用一個const引用,並且如果是非const引用if你確實需要修改。

下面是引用版本以上程序:

#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); 
} 

正如你所看到的,包含內的信息將被傳遞給函數foo,但它不會複製一個完全新的價值,因爲它是通過引用傳遞的。因此,它與傳遞指針一樣高效,並且您可以將其用作正常值,而不必知道如何將其用作指針或不必將其解引用。

+0

這可能是一個愚蠢的評論。但是由於您只使用at方法,使用語法(* a)[1]有什麼優勢?就我個人而言,我喜歡這一點,因爲它更能反映我的說法,這使我更容易閱讀代碼(我的意思是至少在一種情況下顯着提高性能) – patrik