从其地址获取成员的索引

时间:2014-08-31 17:47:16

标签: c++ c++11 indexing memory-address

是否可以通过知道其地址来获取容器中成员的索引?描述所需内容的代码如下。

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

4 个答案:

答案 0 :(得分:2)

如果你有一个内存连续的容器(标准库中有std::basic_string<>std::vector<>std::array<>),那么是的,你可以获得一个元素的索引,如果你有一个引用或者指向它的指针,以及指向容器第一个元素的引用或指针。

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

否则,如果容器不连续,或者您无法访问容器的第一个元素,那么不,您不能。

答案 1 :(得分:1)

vector内部是一个数组,因此您可以使用它。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果数组从内存位置x开始,那么您可以像这样获取索引:&(t.p[i]) - x)