c++怎么初始化一个装引用的二维vector呢?
structA{A():ID(2){}intID;}structB{B():iB();//这里不知道怎么用A的默认构造函数初始化一个100*100的iBvector<ve...
struct A
{
A():ID(2){}
int ID;
}
struct B
{
B(): iB(); //这里不知道怎么用A的默认构造函数初始化一个100*100的iB
vector< vector< A& > > iB;
}
实践太少了,谢谢帮助。
我实践的太少没经验,你们这么说我也觉得不好。改成这样行吗?
struct A
{
A():ID(2){}
int ID;
};
struct B
{
B(): iB(100, vector < A >(100) ){}
vector< vector< A > > iB;
};
我明白了,这里用iB(100, vector < A >(100) )是调用了vector的一个构造函数,是复制100个 vector < A >(100) 到iB中,所以iB的元素是包含100个元素的vector<A>类型。
这样简单些。不用在构造函数体内写东西。
谢谢各位的帮助。 展开
{
A():ID(2){}
int ID;
}
struct B
{
B(): iB(); //这里不知道怎么用A的默认构造函数初始化一个100*100的iB
vector< vector< A& > > iB;
}
实践太少了,谢谢帮助。
我实践的太少没经验,你们这么说我也觉得不好。改成这样行吗?
struct A
{
A():ID(2){}
int ID;
};
struct B
{
B(): iB(100, vector < A >(100) ){}
vector< vector< A > > iB;
};
我明白了,这里用iB(100, vector < A >(100) )是调用了vector的一个构造函数,是复制100个 vector < A >(100) 到iB中,所以iB的元素是包含100个元素的vector<A>类型。
这样简单些。不用在构造函数体内写东西。
谢谢各位的帮助。 展开
5个回答
展开全部
容器的元素不能是引用类型的,引用类型不满足标准规定的CopyConstructible(可复制构造,可析构,可用operator&取地址)的要求。
ISO C++ 23.1.3/3 The type of objects stored in these components must meet the requirements of CopyConstructible types (20.1.3), and the additional requirements of Assignable types.
vector< vector< A > >或者vector< vector< A* > >都是可以用的。 如果容器放指针,需要自己手动delete,比较麻烦,所以对于A的空间占用接近int、复制构造开销不大的情况还是用vector< vector< A > >的好。
对于vector等容器的批量元素非默认值初始化,C++0x提供了std::initializer_list参数的构造函数,不过对于现行的C++03,要是元素能默认初始化,可以resize;否则只能老老实实的循环插入了。
这里每个vector<A>都默认初始化为空向量,不符合要求……因为A可以默认初始化,所以构造100元素的二维向量后直接对每个元素(一维向量)resize就行:
B::B(100)
{
for(vector< vector< A > >::iterator i = iB.begin(); i != iB.end(); ++i)
i->resize(100);
}
ISO C++ 23.1.3/3 The type of objects stored in these components must meet the requirements of CopyConstructible types (20.1.3), and the additional requirements of Assignable types.
vector< vector< A > >或者vector< vector< A* > >都是可以用的。 如果容器放指针,需要自己手动delete,比较麻烦,所以对于A的空间占用接近int、复制构造开销不大的情况还是用vector< vector< A > >的好。
对于vector等容器的批量元素非默认值初始化,C++0x提供了std::initializer_list参数的构造函数,不过对于现行的C++03,要是元素能默认初始化,可以resize;否则只能老老实实的循环插入了。
这里每个vector<A>都默认初始化为空向量,不符合要求……因为A可以默认初始化,所以构造100元素的二维向量后直接对每个元素(一维向量)resize就行:
B::B(100)
{
for(vector< vector< A > >::iterator i = iB.begin(); i != iB.end(); ++i)
i->resize(100);
}
参考资料: 原创 + ISO/IEC 14882:2003
展开全部
1、vector<int> ivec {10, 11, 12}
用到了c++11的新特性,初始化列表,initialize_list
而vistual studio 2012并不支持c++11这一特性。
2、vector<int> ivec(10,-1);
vector 存在这个版本的构造函数
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
用到了c++11的新特性,初始化列表,initialize_list
而vistual studio 2012并不支持c++11这一特性。
2、vector<int> ivec(10,-1);
vector 存在这个版本的构造函数
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
vector内的元素需要有默认构造函数和赋值操作符(也就是=)这时生成的iB已经是一个a的二维数组了。如果需要制定为100。可以这样操作。
struct A
{
A():ID(2){}
int ID;
};
struct B
{
B():iB(100)
{
for(vector< vector< A > >::iterator beg = iB.begin();
beg != iB.end();
++beg)
{
beg->resize(100);
}
} //这里不知道怎么用A的默认构造函数初始化一个100*100的iB
vector< vector< A > > iB;
};
struct A
{
A():ID(2){}
int ID;
};
struct B
{
B():iB(100)
{
for(vector< vector< A > >::iterator beg = iB.begin();
beg != iB.end();
++beg)
{
beg->resize(100);
}
} //这里不知道怎么用A的默认构造函数初始化一个100*100的iB
vector< vector< A > > iB;
};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-03-22
展开全部
在B中写一个
vector< vector< A& > >类型返回值的函数,把那个函数扔到iB后面的括号里面。
不过我有个建议啊,你这样用引用,感觉有些危险呃,很可能数据都是乱的,就是说是访问到了一块已经不是A型对象的地址上了,然后按A来理解这块地址。
vector< vector< A& > >类型返回值的函数,把那个函数扔到iB后面的括号里面。
不过我有个建议啊,你这样用引用,感觉有些危险呃,很可能数据都是乱的,就是说是访问到了一块已经不是A型对象的地址上了,然后按A来理解这块地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
vector 的元素必须具备 赋值 和复制两个性质,您觉得用引用做元素类型有意思吗?
追问
我改了一下,能帮我看看可以吗?谢谢
追答
B(): iB(100, vector (100) ){}// 不是分号;
结构体用 分号 结束
顺便说一下,不建议这样用,很麻烦,你可以先想想怎么输出
struct A
{
A():ID(2){}
int ID;
};
ostream& operator(10) ){};
vector > iB;
};
int main()
{
B b;
vector >::iterator iter;
vector::iterator it;
for(iter=b.iB.begin();iter!=b.iB.end();++iter)
{
for(it=iter->begin();it!=iter->end();++it)
cout<<*it<<" ";
cout<<endl;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询