C++ 就地转换 vector 类型

标签 c++ data-structures

是否可以在不创建新数据结构的情况下做到这一点? 假设我们有

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.

相关阅读:

  1. Are std::vector elements guaranteed to be contiguous?
  2. How to convert vector to array in C++

关于C++ 就地转换 vector 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073588/

相关文章:

c++ - 常量不匹配 : 2 overloads have no legal conversion for 'this' pointer

c++ - 使用元数据标记 C++ 类实例

c++ - 划分忽略休息的有效方法

algorithm - 实现随机删除和插入的数据结构,其中元素在 [a,b] 中加权

java - 整数的 hashCode 的最佳实现是什么?

python - 为单词python创建一个嵌套字典

c++ - 理解删除字符串中重复字符的代码(来自破解编码面试)

c++ - 单独文件中的函数实现

algorithm - 函数 n^2/log(n) 的大 O 是什么?

java - 到达图形数据结构中的所有节点