是否可以通过知道其地址来获取容器中成员的索引?描述所需内容的代码如下。
#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;
}
答案 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)