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