动态创建填充数组及std::vector初始化报错问题
嘿,我来帮你理清这个问题!首先咱们先解决你遇到的E0146错误,然后再搞定动态过滤元素的需求~
首先,你的vector初始化错误原因
你写的代码:
const std::vector<std::map<Id, std::vector<Data>>> *const DataSets { &object.data1, &object.data2, &object.data3, &object.data4 };
这里的问题出在类型声明上:const std::vector<...>*是一个指向vector的const指针,而不是你想要的“存储map指针的vector”。指针只能存储单个地址,你给了4个值,编译器当然会报错“初始化值过多”啦!
正确的类型应该是存储const map指针的vector,比如:
// 如果需要后续修改vector(添加/删除元素) std::vector<const std::map<Id, std::vector<Data>>*> DataSets; // 如果vector本身是不可修改的(初始化后不能变) const std::vector<const std::map<Id, std::vector<Data>>*> DataSets;
然后,实现“只加入size不为0的元素”的需求
因为vector是动态容器,我们可以很灵活地根据运行时条件过滤元素,有两种常用方式:
方式1:逐个判断并添加
最直观的写法,逐个检查每个data的状态,不为空就加入vector:
std::vector<const std::map<Id, std::vector<Data>>*> DataSets; if (!object.data1.empty()) { DataSets.push_back(&object.data1); } if (!object.data2.empty()) { DataSets.push_back(&object.data2); } if (!object.data3.empty()) { DataSets.push_back(&object.data3); } if (!object.data4.empty()) { DataSets.push_back(&object.data4); }
这里用empty()比size() == 0更高效哦,因为某些容器的size()可能需要遍历计算,而empty()是O(1)操作。
方式2:初始化时完成过滤(C++11及以上)
如果你想让vector是const的(初始化后不能修改),可以用lambda表达式在初始化时完成所有判断:
const auto DataSets = []{ std::vector<const std::map<Id, std::vector<Data>>*> temp; if (!object.data1.empty()) temp.push_back(&object.data1); if (!object.data2.empty()) temp.push_back(&object.data2); if (!object.data3.empty()) temp.push_back(&object.data3); if (!object.data4.empty()) temp.push_back(&object.data4); return temp; }();
这样DataSets会被初始化为包含所有非空data指针的const vector,完美符合你的需求。
补充:为什么原来的C数组没法直接实现?
C风格数组的大小是编译期确定的,没法根据运行时的size()结果动态调整元素数量,所以你一开始的需求用C数组根本没法实现,改用vector是完全正确的选择!
内容的提问来源于stack exchange,提问作者Md. Parwez Akhtar
相关产品推荐
相关产品推荐

