我有一个结构矢量和它的组件,现在我想要这个组的数组,下面是我的代码
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
的数组答案 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);
}