在我的代码中,我有类似的东西:
struct SomeStruct
{
int test1;
int test2;
float test3;
float test4;
};
std::vector<SomeStruct> SomeStructs;
我正在寻找一种方法以连续的方式获取该向量的一部分,以便我可以使用指针或c-array访问它。
假设我想要一个指针只访问test2结构的一部分。 我想将向量的那部分传递给C API,是否可能?
我正在努力避免创建一个新的std :: vector / c-array。
它在内存中的样子(种类):
答案 0 :(得分:4)
不,你所要求的是不可能的。快速回顾:
您的选择如下:
对于3,值得注意的是,一些C API,特别是BLAS,支持“跨步”数组,这意味着元素之间存在固定的大小差距,这将为您解决此问题。
答案 1 :(得分:0)
要以惯用的方式实现此功能,您需要滚动自己专门返回该字段的自定义iterator
。
查看c++ how to create iterator over one field of a struct vector
C和C ++的互操作性是一个截然不同的问题。为简化起见,您可能只想在C中实现它。
答案 2 :(得分:0)
无法从指针或数组中仅访问每个test2
的内容,因为即使向量中的结构,test2
成员在内存中也不连续。结构中还有其他数据,因此您需要跳过它来阅读每个test2
。
当您发现自己提出类似这样的问题时,请尝试考虑可以使用的其他数据结构,以便更轻松地解决问题。对于这种情况,也许std::unordered_map
可能是一个不错的选择。
std::unordered_map<int,SomeStruct> map;
// make a struct...
map.insert(std::make_pair<int,SomeStruct>(a_struct.test2,a_struct));
// add a bunch more structs...
// get an iterator to all the keys in the map (ie. something like a pointer to all test2 members)
key_iterator = map.begin()
答案 3 :(得分:0)
如果我能帮到你,我认为这是可能的。
//p is the price array, n is the size of the array/rod, i is index initial called with 0
int cutRod(int p[],int n,int i){
if(n<=0 || i>=n){
return 0;
}
return max(p[i]+cutRod(p,n-(i+1),0),cutRod(p,n,i+1));
}
您现在可以将struct SomeStruct
{
int test1;
int test2;
float test3;
float test4;
};
int size = 3;// whatever size
vector<SomeStruct> myStruct(size);
myStruct[0].test1 = 0;
myStruct[1].test1 = 1;
myStruct[2].test1 = 2;
/* myPtest1 will allow you to get the test1 part of myStruct in a
contiguous memory manner*/
int *myPtest1 = new int(myStruct.size());
for(int i = 0; i< myStruct.size(); i++)
myPtest1[i] = myStruct[i].test1;
// for illustration.
cout << myPtest1[0] << endl; // 0
cout << myPtest1[1] << endl; // 1
cout << myPtest1[2] << endl; // 2
传递给您的API,myPointer只允许您访问myPointer
部分test1
向量。
您可以对其余的myStruct
属性执行相同操作。
答案 4 :(得分:-1)
如果你想在for循环中访问它,你可以这样做:
for (const auto& iterator: SomeStructs)
{
const int& test2 = iterator.test2;
// do what you need to do
}
如果你需要第j个元素:
const int& test2 = SomeStructs[j].test2
通过这种方式,您不会制作额外的副本,而是直接引用向量中的项目。如果需要更改值
,请删除const