如何正确初始化并填充包含vector的结构体的vector?
解决结构体中vector成员的编译报错问题
你遇到的编译错误原因很明确:std::vector的push_back()方法必须传入对应类型的元素作为参数,你写的s[i].sum.push_back();和s[i].language.push_back();都是空参数调用,编译器找不到接受0个参数的重载版本,所以报了C2661错误。
另外还要注意,你后面直接用下标s[i].sum[k]赋值的操作,如果sum的size没有达到k+1,会触发越界访问的未定义行为,这也是需要避免的。
下面给你几种正确填充sum和language成员的方案:
方案一:直接push_back目标值(最常用)
不需要先空push再赋值,直接把要添加的元素传入push_back即可:
#include <vector> #include <string> struct lang_accuracy{ std::vector<int> sum; std::vector<std::string> language; }; int main() { std::vector<lang_accuracy> s; // 假设外层循环条件是i < some_num for (int i = 0; i < 3; ++i) { s.push_back(lang_accuracy()); // 假设内层循环要添加2个元素 for (int k = 0; k < 2; ++k) { // 直接传入int类型的值到sum的push_back s[i].sum.push_back(k * 10 + i); // 同理传入string类型的值到language s[i].language.push_back("lang_" + std::to_string(k)); } } return 0; }
方案二:先resize分配空间,再用下标赋值(适合已知元素数量的场景)
如果你提前知道sum和language需要存储多少个元素,可以先调用resize()把vector的大小调整到目标值,之后就能安全地用下标赋值:
#include <vector> #include <string> struct lang_accuracy{ std::vector<int> sum; std::vector<std::string> language; }; int main() { std::vector<lang_accuracy> s; const int elem_count = 2; // 已知要添加的元素数量 for (int i = 0; i < 3; ++i) { s.push_back(lang_accuracy()); // 先调整sum和language的大小 s[i].sum.resize(elem_count); s[i].language.resize(elem_count); for (int k = 0; k < elem_count; ++k) { s[i].sum[k] = k * 10 + i; s[i].language[k] = "lang_" + std::to_string(k); } } return 0; }
方案三:先构建临时vector,再初始化结构体(更简洁)
可以先在内层循环中把sum和language的元素都准备好,再用临时vector直接初始化lang_accuracy对象,最后添加到s中:
#include <vector> #include <string> struct lang_accuracy{ std::vector<int> sum; std::vector<std::string> language; }; int main() { std::vector<lang_accuracy> s; for (int i = 0; i < 3; ++i) { std::vector<int> temp_sum; std::vector<std::string> temp_lang; for (int k = 0; k < 2; ++k) { temp_sum.push_back(k * 10 + i); temp_lang.push_back("lang_" + std::to_string(k)); } // 用临时vector初始化结构体,再添加到s s.push_back({temp_sum, temp_lang}); } return 0; }
总结一下:核心就是要遵守push_back的调用规则——必须传入对应类型的元素;如果要用下标赋值,一定要确保vector的size足够容纳该下标位置的元素,避免越界。
内容的提问来源于stack exchange,提问作者Cabal
相关产品推荐
相关产品推荐

