我有一個指向矢量的指針。現在,我怎樣才能通過指針讀取矢量的內容?我知道這是一個基本問題,但我無法找到同樣的答案。(C++)指向矢量的指針
指向矢量的指針
回答
解決方法有很多,這裏有幾個我想出來的:
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!)
}
有很多解決方案。例如,您可以使用at()
方法。
*我以爲你找一個相當於[]
的操作符。
但如何知道向量中元素的數量? – Pavan
@ user815961'v-> size()'返回向量 – Praetorian
訪問它像任何其他指針值:
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;
}
中向上的元素數目,就像「任何其他指針」一樣。我不明白這個問題。你有一個指針,所以你使用'thing-> member'而不是'thing.member',這是唯一的區別(在99%的情況下,等等) –
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];
最簡單的方式來使用它作爲陣列是使用vector::data()
成員。
您使用向量的原因是爲了抽象出背後的底層實現(連續數組)。這違背了面向對象的原則,更不用說效率極低了,因爲當你可以使用vec-> at(index)的時候,你正在分配一個全新的n數組。更何況,這與原始海報的問題完全沒有關係,因爲你沒有在任何地方使用指向矢量的指針。 –
我只是給出了一個例子,如果我們想知道底層類型,我們可以使用vector :: value_type。但它是靜態解釋的。我想傳達的觀點是data()是獲取底層指針的成員。這就是他的問題所在。 – sarat
不,問題是'vector'是否可以通過指針讀取。我沒有看到OP中的任何內容,表明比這更深的東西。 –
你有一個指向矢量的指針,因爲這就是你編碼的方式嗎?您可能需要重新考慮這一點並使用(可能是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,但它不會複製一個完全新的價值,因爲它是通過引用傳遞的。因此,它與傳遞指針一樣高效,並且您可以將其用作正常值,而不必知道如何將其用作指針或不必將其解引用。
這可能是一個愚蠢的評論。但是由於您只使用at方法,使用語法(* a)[1]有什麼優勢?就我個人而言,我喜歡這一點,因爲它更能反映我的說法,這使我更容易閱讀代碼(我的意思是至少在一種情況下顯着提高性能) – patrik
- 1. 指向矢量的指針不指向
- 2. 訪問指向矢量的指針C++
- 3. 「合併」指向矢量的指針
- 4. 刪除指向矢量的指針
- 5. C++指向矢量的指針
- 6. 創建指向矢量的指針,類
- 7. C++矢量指針指針
- 8. C++指針分配(指向矢量)
- 9. 指向矢量指針Vs的指針迭代器
- 10. 使用矢量指針指向對象的指針C++
- 11. C++矢量對象與指向對象的指針的向量
- 12. 指向矢量
- 13. 指針在矢量
- 14. 智能指針或矢量矢量的常規指針
- 15. 指針(指針)和新/ malloc矢量(在矢量內)C++
- 16. 矢量的指針,指向矢量對象中的對象。怎麼做?
- 17. 清除指針的矢量
- 18. 從矢量的指針
- 19. 矢量由指針的類
- 20. 矢量指針和的push_back()
- 21. 指向變量的指針
- 22. 指向矢量的指針是如何工作的?
- 23. C++。矢量指針和使用矢量
- 24. 矢量矢量(成員)函數指針
- 25. 矢量指針內存分配矢量
- 26. 指向陣列的指針持有兩個矢量
- 27. 將矢量轉換爲映射到指向成員的指針?
- 28. 指向矢量第一個字節的指針<float>
- 29. 指向矢量中項目的指針不穩定。
- 30. 指向矢量的指針:正在獲取分段錯誤
到目前爲止您嘗試過什麼?你能提供一些代碼,所以我們可以具體談一談嗎? – Nate
您確定要使用指向矢量的指針嗎?使用引用可能更有意義。看到我的帖子下面。 –