You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确初始化并填充包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:43:40