2014-08-31 62 views
0

是否可以通過知道其地址獲取容器中成員的索引?下面是描述所需內容的代碼。從其地址獲取成員的索引

#include <iostream> 
#include <vector> 
#include <functional> 
using namespace std; 

struct Point {}; 

struct Triangle 
{ 
    vector<reference_wrapper<Point>> p; 
}; 

int main() 
{ 
    vector<Point> p (3);  

    Triangle t; 
    t.p.push_back (ref(p[0])); 
    t.p.push_back (ref(p[1])); 
    t.p.push_back (ref(p[2])); 
    // push_back order may be random 

    for (unsigned int i=0; i<t.p.size(); ++i) 
    { 
     // print index of t.p.get() in vector<Point>p 
    } 

    return 0; 
} 

回答

2

如果你有一個存儲器中連續容器(std::basic_string<>,在標準庫std::vector<>std::array<> ),那麼是的,如果你有一個引用或者一個指針,你可以得到一個元素的索引,以及一個引用或者指向容器第一個元素的指針。

std::vector<X> v; 
... 
X* xp = &v[100]; 
auto index = xp - &v[0]; // index == 100 

否則,如果容器不是連續的,或者您沒有權限訪問容器的第一個元素,則不能。

0
for (unsigned int i = 0; i < t.p.size(); ++i) 
{ 
    std::cout << "Index = " << &t[t.size()] - &t.at(i) << std::endl; 
} 
0

如果陣列開始於存儲器位置x,然後就可以得到像這樣的索引:&(t.p[i]) - x)

1

vector在內部是一個數組,因此您可以使用它。

int index = &t.p.get() - &p[0];