C++ 参与std::vector C++;

C++ 参与std::vector C++;,c++,struct,stdvector,C++,Struct,Stdvector,在我的代码中,我有如下内容: struct SomeStruct { int test1; int test2; float test3; float test4; }; std::vector<SomeStruct> SomeStructs; struct SomeStruct { int test1; int test2; 浮动试验3; 浮动试验4; }; std::向量SomeStructs; 我正在寻找一种方法,以连续的方式获取向量的一部分,这样我就可以用

在我的代码中,我有如下内容:

struct SomeStruct
{
  int test1;
  int test2;
  float test3;
  float test4;
};
std::vector<SomeStruct> SomeStructs;
struct SomeStruct
{
int test1;
int test2;
浮动试验3;
浮动试验4;
};
std::向量SomeStructs;

我正在寻找一种方法,以连续的方式获取向量的一部分,这样我就可以用指针或c数组访问它

假设我想要一个指针,只访问结构的test2部分。 我想把向量的这一部分传递给C API,有可能吗

我试图避免创建新的std::vector/c-array

它在记忆中的样子(有点):


要以惯用的方式实现这一点,您需要滚动您自己的自定义
迭代器,该迭代器专门返回该字段

看看


C和C++互操作性是一个很大的问题。为了简化事情,您可能只想在C中实现它。

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

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

  • 将变量更改为4个变量向量,而不是一个结构向量
  • 需要时创建一个新向量
  • 不要使用需要连续内存的C API

  • 对于3,值得注意的是,一些C API,尤其是BLAS,支持“跨步”数组,这意味着元素之间存在固定大小的间隙,这将为您解决此问题。

    如果您想在For循环中访问它,可以执行以下操作:

    for (const auto& iterator: SomeStructs)
    {
        const int& test2 = iterator.test2;
        // do what you need to do
    }
    
    如果需要第j个元素:

    const int& test2 = SomeStructs[j].test2
    

    通过这种方式,您不会制作额外的副本,而是直接引用vector中的项。如果需要更改值,请删除常量。无法仅从指针或数组访问每个
    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()
    
    std::无序地图;
    //做一个结构。。。
    insert(std::make_pair(a_struct.test2,a_struct));
    //添加一堆更多的结构。。。
    //获取映射中所有键的迭代器(例如,指向所有test2成员的指针)
    key_iterator=map.begin()
    
    如果我对你有好处,我认为这是可能的

    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
    
    struct SomeStruct
    {
    int test1;
    int test2;
    浮动试验3;
    浮动试验4;
    };
    int size=3;//不管大小
    向量myStruct(大小);
    myStruct[0].test1=0;
    myStruct[1].test1=1;
    myStruct[2].test1=2;
    /*myPtest1将允许您在
    连续内存方式*/
    int*myPtest1=newint(myStruct.size());
    对于(int i=0;iCUT没有语言“C/C++”,向量是纯C++的构造,所以请从标题和标签中删除C。你能提供更多关于你的意思的信息吗:我想要一个只访问该列的指针。你能指定指针的用途吗?“我正在寻找一种方法,以连续的方式获取向量的一部分,这样我就可以用指针或C数组来访问它。”对不起,这是不可能的;
    vector
    在内存中作为相邻的
    SomeStruct
    实例的序列排列,因此
    test2
    列中的每个元素都是
    sizeof(SomeStruct)
    字节,而不是像
    int[]中那样仅相隔
    sizeof(int)
    字节。所以,除非你复制了这些数据,否则你不能有一个指向“刚才那个列”的指针,就像它是指向一个规则数组中的一个元素的指针。C++的代码是使用数组结构(SOA)而不是结构数组(AOS)。也就是说,每列一个向量。将其打包在一个类中,重载运算符用于方便的C++ API。将std::vector::data()传递给C API。@Drop我试试。谢谢大家!@约翰米兹如果我能把你弄明白,我想这是可能的