C++类的矢量矢量

C++类的矢量矢量,c++,data-structures,C++,Data Structures,是否可以在不创建新数据结构的情况下执行此操作? 假设我们有 struct Span{ int from; int to; } vector<Span> s; 我们想通过强制转换直接从s得到一个整数向量 vector<Span> s; 到 因此,我们可以从、到元素中删除/更改一些元素,然后将其转换回 vector<Span> s; 这不是一个好主意,但我会告诉你怎么做 可以通过以下方式获得指向整数的原始指针: int * myPoint

是否可以在不创建新数据结构的情况下执行此操作? 假设我们有

struct Span{
    int from;
    int to;
}
vector<Span> s;
我们想通过强制转换直接从s得到一个整数向量

vector<Span> s;

因此,我们可以从、到元素中删除/更改一些元素,然后将其转换回

vector<Span> s;  

这不是一个好主意,但我会告诉你怎么做

可以通过以下方式获得指向整数的原始指针:

int * myPointer2 = (int*)&(s[0]);
但这是一种非常糟糕的做法,因为你不能保证跨度结构没有任何缺陷,因此,尽管它可能适合我和你,但我们不能对其他系统说太多

#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;
}
正如我所说的,硬重新解释cast通常会起作用,但非常危险,并且缺乏您通常期望从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;
注意我是如何使用指向向量的指针并指向向量对象s的地址的。我希望这两个向量的内部是相同的,我可以像那样使用它们。对我来说,这是可行的,虽然标准模板可能幸运地要求这样做,但对于模板化类来说,通常情况并非如此,例如填充和模板专门化

请考虑复制一个数组,请参见下面的参考2,或者只使用s.from和s[2].to

相关阅读:

免责声明:我完全不知道你想做什么。我只是做一些有根据的猜测,并在此基础上给出可能的解决方案。希望我猜对了,你就不必用愚蠢的演员做疯狂的恶作剧了

如果要从向量中删除某个元素,只需找到该元素并使用将其删除即可。您的元素需要一个迭代器,而获得该迭代器取决于您对所讨论的元素的了解。给定std::向量v;:

如果您知道它的索引:

v.erase(v.begin() + idx);
如果您有一个与您要查找的对象相等的对象:

Span doppelganger;
v.erase(std::find(v.begin(), v.end(), doppelganger));
如果您有一个与正在查找的对象相等的对象,但要删除所有相等的元素,则需要使用“删除”惯用法:

Span doppelganger;
v.erase(std::remove(v.begin(), v.end(), doppelganger)),
        v.end());
如果您有一些选择图元的标准:

v.erase(std::find(v.begin(), v.end(),
                  [](Span const& s) { return s.from == 0; }));

// in C++03 you need a separate function for the criterion
bool starts_from_zero(Span const& s) { return s.from == 0; }

v.erase(std::find(v.begin(), v.end(), starts_from_zero));
如果您有一些标准,并希望删除符合该标准的所有元素,则需要再次使用“删除”习惯用法:

v.erase(std::remove_if(v.begin(), v.end(), starts_from_zero)),
        v.end());
如果sizeofSpan==sizeofint*2,即Span没有填充,则可以安全地使用reinterpret_cast&v[0]获取指向可以迭代的int数组的指针。您可以保证每个编译器都没有填充结构,GCC中有_属性____打包____uu,VisualStudio中有pragma pack

然而,有一种方法是由标准保证的。这样定义跨度:

端点[0]和端点[1]必须是连续的。如果您愿意,为方便您添加一些from和to访问器,但现在您可以使用reinterpret_cast&v[0]来满足您的需要


但是,如果您打算大量使用这种指针搜索,您可能希望创建自己的类似向量的数据结构,这种结构更适合这种处理方式,它提供了更多的安全保证,因此您可以避免受伤。

您的描述毫无意义。这听起来像是一个案例。你到底想干什么?你能举个例子吗?很难猜出你想要什么。你能举个例子吗?@R.MartinhoFernandes:我想海报想把一个向量变成一个向量,然后在把它变回向量之前再从这个向量中得到一些其他的向量。不过,我认为这是不可能的。我非常肯定,至少在java中,这是一个非常错误的操作,我认为C++中没有这样做的可能,因为这是一个有趣的问题,即使它可能是个坏主意。@多晶硅:首先,你应该问我有这个算法做这样的事情,但是它制作了一个拷贝。我怎样才能在适当的地方做呢?。第二,向量不是一个复杂的数据结构。第三,为什么你认为你需要破解任何东西才能做到这一点?+1:我在我的VBox中尝试了这个,但我没有想到投出指针然后返回。这种技巧看起来更像是在C中发现/破解的东西,正如您所指出的,它确实非常危险。一个非常好的答案^^^我认为更好的方法是将指针转换为2个元素的数组:reinterpret_cast&s[0];,并使用下标运算符访问各个成员。然而,我认为这是stll可怕的未定义行为。@R.MartinhoFernandes是的,Windows 7 64位、Intel 2600k、Visual Studio 2008 9.0.30729.1有争议的强制转换是不必要的。将第一行替换为int*myPointer2=&s[0];实际上,它适用于sizeof Span=2*sizeof int的任何系统,因为这使得所有指针的数学结果都是一样的。谢谢。很好的解释。这几乎就是我要找的——一个肮脏的伎俩,破解C++ STL并使之有效。唯一的问题是这个黑客不会自动纠正内部va lues/向量的成员,如果在向量转换为向量后插入/删除了一些元素,那么我们以后可能会遇到一些问题。复制向量会使代码速度过慢。我想最好的方法还是创建一个新的数据结构——一个定制的动态数组。
v.erase(std::remove_if(v.begin(), v.end(), starts_from_zero)),
        v.end());
struct Span {
    int endpoints[2];
};