是否可以在不创建新数据结构的情况下做到这一点? 假设我们有
struct Span{
int from;
int to;
}
vector<Span> s;
我们想通过强制转换直接从 s 得到一个整数 vector
vector<Span> s;
到
vector<int> s;
所以我们可以删除/更改一些“from”、“to”元素,然后将其转换回
vector<Span> s;
最佳答案
这不是一个好主意,但我会告诉你怎么做。
您可以通过这种方式获得指向整数的原始指针:
int * myPointer2 = (int*)&(s[0]);
但这确实是一种糟糕的做法,因为您不能保证 span 结构没有任何 padding ,所以虽然它今天对我和你来说可能工作得很好,但我们不能对其他系统说太多。
#include <iostream>
#include <vector>
struct Span{
int from;
int to;
};
int main()
{
std::vector<Span> s;
Span a = { 1, 2};
Span b = {2, 9};
Span c = {10, 14};
s.push_back(a);
s.push_back(b);
s.push_back(c);
int * myPointer = (int*)&(s[0]);
for(int k = 0; k < 6; k++)
{
std::cout << myPointer[k] << std::endl;
}
return 0;
}
正如我所说,硬性重新解释转换通常会奏效,但非常危险,并且缺乏您通常期望从 C/C++ 获得的跨平台保证。
下一个更糟糕的事情是,它实际上会做你要求但你永远不应该做的事情。这是您可能会被解雇的代码:
// Baaaad mojo here: turn a vector<span> into a vector<int>:
std::vector<int> * pis = (std::vector<int>*)&s;
for ( std::vector<int>::iterator It = pis->begin(); It != pis->end(); It++ )
std::cout << *It << std::endl;
请注意我是如何使用指向 vector 的指针并指向 vector 对象 s 的地址的。我希望这两个 vector 的内部是相同的,我可以像这样使用它们。对我来说,这是有效的,虽然标准模板可能幸运地要求这种情况,但对于模板化类通常不是这样(参见填充和模板特化等内容)。
考虑复制一个数组(参见下面的引用文献 2)或只使用 s 1 .from 和 s[2].to.
相关阅读:
关于C++ 就地转换 vector 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073588/