参加std :: vector C ++

时间:2017-05-28 20:29:25

标签: c++ struct stdvector

在我的代码中,我有类似的东西:

struct SomeStruct
{
  int test1;
  int test2;
  float test3;
  float test4;
};
std::vector<SomeStruct> SomeStructs;

我正在寻找一种方法以连续的方式获取该向量的一部分,以便我可以使用指针或c-array访问它。

假设我想要一个指针只访问test2结构的一部分。 我想将向量的那部分传递给C API,是否可能?

我正在努力避免创建一个新的std :: vector / c-array。

它在内存中的样子(种类):

enter image description here

5 个答案:

答案 0 :(得分:4)

不,你所要求的是不可能的。快速回顾:

  1. 我们可以清楚地看到结构的test2条目当前没有在内存中连续布局,因为它们只是连续结构的一个成员,因此很明显其他结构元素位于每次出现的test2之间。
  2. 您希望它们是连续的,因此您需要的内存布局与目前不同。
  3. 您不想创建新的矢量或数组,因此您会陷入当前的内存布局,这是错误的。
  4. 您的选择如下:

    1. 将变量改为4个变量向量而不是一个结构向量。
    2. 在需要时创建一个新的矢量。
    3. 请勿使用需要连续内存的C API。
    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