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

多层复合关系中通过vec3对象访问vec1成员变量x的方法

访问嵌套vector中vec1的x变量的方法

要通过v3对象访问并打印vec1的x变量,核心是逐层遍历嵌套的vector容器,你主要会用到vector的以下成员函数:


常用的vector成员函数

  • begin() / end():获取容器的起始和结束迭代器,用于遍历容器内的元素(范围for循环底层也依赖这两个函数)。
  • operator[]:通过下标直接访问指定位置的元素,语法简洁但不做越界检查。
  • at():和operator[]功能类似,但会执行越界检查,访问超出范围的元素时会抛出std::out_of_range异常,更安全。
  • size():获取容器内的元素个数,用来确定循环的边界。

具体代码示例

首先要注意:你当前创建的v3对象是空的(v3.v2没有任何元素),所以需要先往里面添加数据才能访问x。下面是完整的示例代码:

步骤1:填充数据

#include <iostream>
#include <vector>

class vec1{ public: int x; vec1(int n):x(n){} };
class vec2{ public: std::vector<vec1> v1; };
class vec3{ public: std::vector<vec2> v2; };

int main() {
    vec3 v3;

    // 给v3添加测试数据
    vec2 v2_1;
    v2_1.v1.push_back(vec1(10));
    v2_1.v1.push_back(vec1(20));
    v3.v2.push_back(v2_1);

    vec2 v2_2;
    v2_2.v1.push_back(vec1(30));
    v2_2.v1.push_back(vec1(40));
    v3.v2.push_back(v2_2);

    // 接下来是打印x的代码

方法1:范围for循环(最简洁,依赖begin()/end())

// 遍历v3.v2中的每个vec2对象
    for (const auto& vec2_obj : v3.v2) {
        // 遍历当前vec2对象中的v1容器(vector<vec1>)
        for (const auto& vec1_obj : vec2_obj.v1) {
            std::cout << vec1_obj.x << " ";
        }
    }
    std::cout << std::endl;

方法2:显式迭代器循环(直接调用begin()/end())

// 遍历v3.v2的迭代器
    for (auto vec2_it = v3.v2.begin(); vec2_it != v3.v2.end(); ++vec2_it) {
        // 遍历当前vec2对象中v1的迭代器
        for (auto vec1_it = vec2_it->v1.begin(); vec1_it != vec2_it->v1.end(); ++vec1_it) {
            std::cout << vec1_it->x << " ";
        }
    }
    std::cout << std::endl;

方法3:下标访问+size()控制循环

// 遍历v3.v2的每个元素下标
    for (size_t i = 0; i < v3.v2.size(); ++i) {
        // 遍历当前vec2对象中v1的每个元素下标
        for (size_t j = 0; j < v3.v2[i].v1.size(); ++j) {
            // 用operator[]访问
            std::cout << v3.v2[i].v1[j].x << " ";
            // 或者用at()做安全访问
            // std::cout << v3.v2.at(i).v1.at(j).x << " ";
        }
    }
    std::cout << std::endl;

    return 0;
}

以上三种方法都能成功打印出vec1的x变量,你可以根据场景选择:

  • 优先用范围for循环,代码最简洁易读;
  • 需要更精细的迭代控制时用显式迭代器;
  • 追求访问安全性时用at()代替operator[]。

内容的提问来源于stack exchange,提问作者Santosh Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:34