C ++ </struct>中的vector <struct>数组

时间:2014-01-24 06:52:22

标签: c++ vector

我有一个结构矢量和它的组件,现在我想要这个组的数组,下面是我的代码

struct V1
{
USHORT val;
UINT cnt;
USHORT state;
};

struct V2
{
DWORD room;
vector <V1> vref;
bool update_V1(USHORT S1, USHORT S2);
VOID ClearState(USHORT S1);

};
struct V3
{
USHORT block;
vector <V2> V2ref;
bool Update_V2(DWORD S1,USHORT S2,USHORT S3);
VOID ClearState_V2(USHORT S4);
};
struct V4
{
USHORT space;
vector <V3> V3ref;
bool Update_V3(USHORT S1,DWORD S2,USHORT S3);
VOID ClearState_V2(USHORT S4);

};
struct V5
{
USHORT del_1;
vector <V4> V4ref;
bool Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4);
VOID ClearState_V2(USHORT S4);
};

class C1
{
vector<V5> V5ref[2];
bool UpdateGroup(USHORT S1,USHORT S2,USHORT S3,DWORD S4,USHORT S5);

}

bool C1::UpdateGroup(USHORT S1,USHORT S2,USHORT S3,DWORD S4,USHORT S5)
{
    vector<V5>::iterator it;
for ( it=V5ref[S5].begin() ; it< V5ref[S5].end(); it++ )
{
    if(it->del_1==S2)
    {
        return grpItr->Update_V4(S1,S2,S3,s4);
    }
}
V5 V5local;
V5local.del_1 = S2;
V5local.Update_V4(S1,S2,S3,S4);
V5ref[S5].push_back(V5local);
return true;
 }

我尝试使用矢量V5ref [2]; 它适用于第一次迭代,并为第二次迭代抛出错误“断言”,这可能是原因。是否还有其他选项可以复制载体。

究竟我想要做的是,参数S2为1,2,3,我想要S2 = 1,S2 = 2 ... V5的整个矢量的diff数组,它的组件应该是单独的元素根据S2

的数组

2 个答案:

答案 0 :(得分:2)

我已经研究过你的问题了。由于代码不足,我们都只能猜测你在做什么或不做什么。如果向量没有足够的空间分配,通常会出现调试断言。 (如果我错了,请纠正我)。因此,在这种情况下,在使用向量之前,您应该使用resize();方法。这是一个例子:

struct structure
{
    int value1;
    char value2;
    bool value3;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<structure> vector1;
    vector1.resize(1);

    vector1[0].value1 = 12;
    vector1[0].value2 = 'h';
    vector1[0].value3 = true;

    return 0;
}

如果您自己进行测试,您会知道如果没有vector.resize(1);这将无法在运行时使用。

答案 1 :(得分:0)

在任何给定时间,std::vector<>都有一个约束,size这是您可以访问的最大元素数+ 1,以及一个约束capacity,它可以包含多少元素包含之前必须将数据移动到更大的内存分配。

size确定您可以访问的内容。创建向量时,您无法访问任何内容。当向量为空时,vec[0]是非法的。

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> vec;

    std::cout << "initially, vec.size = " << vec.size() << ", cap = " << vec.capacity() << "\n";

    // initially, the vector is empty. 

    // std::cout << vec[0] << '\n'; // undefined behavior, probably a crash
    // you can only ever access vec[n] where v < vec.size(),
    // this vector is empty, so size() == 0

    // Lets add a number to the vector.
    vec.push_back(5);
    std::cout << "now, vec.size = " << vec.size() << ", cap = " << vec.capacity()         

    std::cout << "vec[0] = " << vec[0] << '\n';
    // std::cout << vec[1] << '\n'; // undefined behavior because 1 >= size()

    vec.resize(5);
    std::cout << "resized, vec.size = " << vec.size() << ", cap = " << vec.capacity()         

    vec[1] = 1; // valid, resize made space for vec[0] .. vec[4]
    vec[2] = 2;

    for (auto it = vec.begin(), end = vec.end(); it != end; ++it)
        std::cout << *it << '\n';

    return 0;
}

push_back为您执行“vec.resize(vec.size()+ 1)”,然后将值“push_back”插入到新插槽中。

resize尝试为额外元素腾出空间 - 如果大小为3而您说resize(5)则会尝试为2个新元素腾出空间。

如果结果导致size超过capacity,则向量将分配一个新数组,将旧数据复制到其中,然后释放旧数组。这可能变得非常昂贵。如果你大致知道你的矢量有多大,你可以通过调用reserve()来避免这种重新定位

#include <iostream>
#include <vector>

using std::cout;

struct Stud // will always tell you when it reproduces
{
    int m_i;
    Stud() : m_i(-1) {}
    Stud(int i) : m_i(i) {}
    Stud(const Stud& rhs) : m_i(rhs.m_i) { cout << "Copying(Ctor) " << m_i << '\n'; }
    Stud& operator=(const Stud& rhs) { m_i = rhs.m_i; cout << "Copying(=) " << m_i << '\n'; return *this; }
};

int main()
{
    std::vector<Stud> studs;

    studs.push_back(0);
    studs.push_back(1);

    studs.reserve(5);

    studs.push_back(5); // remember, this adds to the back.
    studs.push_back(6);

    std::cout << "size of studs " << studs.size();

    return 0;
}

基于此

bool Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4);

我猜你正试图模拟某种多维数组,而你正在做类似的事情

V4Ref[S1]

不检查

if (S1 < V4Ref.size())

C ++有一个函数'assert',如果不满足条件,它将导致Debug构建应用程序终止。

#include <cassert>
#include <vector>

int main()
{
    std::vector<int> vec;
    assert(vec.size() == 0);
    vec.push_back(1);
    vec.resize(5);
    vec.push_back(5);
    assert(vec.size() == 10); // expect to crash here.

    return 0;
}

您可以使用它来帮助捕捉不良尺寸:

bool V4::Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4)
{
    assert(S1 < V4ref.size());
    return V4ref[S1].Update_V3(S2, S3, S4);
}