咨询C++中std::vector插入初始化自定义类实例的更优写法
问题解决:简化自定义类std::vector的初始化写法
你的编译错误原因很明确:x.b.insert(x.b.begin(), 3, A);中的A是类类型,而vector::insert的这个重载需要的是具体的类实例(const A&类型参数),不是类型本身,所以编译器会报错。
下面是几种更简洁的写法:
1. 修正insert调用,传入临时对象
利用A的默认构造函数,传入临时对象A{}(或A()),一次性插入3个默认初始化的A实例到vector开头:
int main() { B x; // 传入临时对象A{}作为模板,插入3个副本 x.b.insert(x.b.begin(), 3, A{}); }
2. 直接初始化vector(如果不需要动态插入)
如果在创建B实例时就想让b包含3个A对象,可以直接在B的成员初始化或main中赋值:
方式一:在B类中直接初始化成员
class B { public: // 直接初始化vector为包含3个默认A对象的容器 std::vector<A> b{3}; }; int main() { B x; // x.b已经有3个A元素,无需额外插入 }
方式二:在main中直接赋值vector
int main() { B x; // 直接创建包含3个A对象的vector并赋值给x.b x.b = std::vector<A>(3); }
3. 用emplace_front批量构造(可选)
如果想逐个在开头构造A对象(避免拷贝),可以用循环配合emplace_front,写法简洁且效率更高:
int main() { B x; for(int i = 0; i < 3; i++) { x.b.emplace_front(); // 直接在vector开头构造A对象,无需临时变量 } }
内容的提问来源于stack exchange,提问作者furynerd
相关产品推荐
相关产品推荐

