C++更改一个向量内的结构值,即在一个结构内,即在另一个向量中

C++ Change value of structs inside a vector, that is inside a struct, that is inside another vector

本文关键字:结构 一个 向量 另一个 C++      更新时间:2023-10-16

我有以下代码(在此处的链接中找到):

    // Example program
#include <iostream>
#include <vector>
#include <chrono>
#include <string>
#include <sstream>
struct ControlStruct {
    std::string port;
    bool timeoutOn;
    int detectionTimeout;
    bool state;
};
struct DeviceStruct {
    std::string name;
    std::vector<ControlStruct> deviceControls;
};
std::vector<DeviceStruct> devices;
int main()
{
    for (int i = 0; i < 10; i++)
    {
        ControlStruct cs;
        DeviceStruct device;
        std::stringstream ss;
        ss << "Device" << i;
        device.name = ss.str();
        for(int k = 0; k < 5; k++)
        {
            ControlStruct cs;
            ss.clear();
            ss << "Port" << i;
            cs.port = ss.str();
            cs.state = false;
            cs.timeoutOn = false;
            cs.detectionTimeout = (k * 2) + 1;
            device.deviceControls.push_back(cs);
        }
        devices.push_back(device);
    }

    //
    // Start devices
    //
    for (auto device : devices)
    {
        for (auto control : device.deviceControls)
        {
            control.timeoutOn = true;
            control.state = true;
            std::cout << "Starting device " << device.name << " with timeout of " << control.detectionTimeout << " sec." << std::endl;
        }
    }
    while (1)
    {
        for (auto device : devices)
        {
            for (auto control : device.deviceControls)
            {
                if (!control.state)
                    continue;
                std::cout << "I NEVER GET HERE!!!!!!!!!!!!" << std::endl;
                control.detectionTimeout--;
                if (control.detectionTimeout == 0)
                {
                    control.state = false;
                    std::cout << "Device " << device.name << " timed-out." << std::endl;
                }
                else
                    std::cout << "Device " << device.name << " count = " << control.detectionTimeout << std::endl;
            }
        }
    }
}

出于某种原因,我从未进入I NEVER GET HERE!!!代码。。。

有没有一种特殊的方法来设置向量中的结构值?我是不是遗漏了什么?

我使用的是C++11,gcc-linux。

谢谢你的帮助。

当你有这样的东西时:

std::vector<DeviceStruct> devices;
for (auto device : devices) { ... }

这将遍历设备向量中的所有DeviceStruct值。然而,"自动设备"的意思是"给我一份物品的副本"。

一旦你这样做了,你所做的任何修改都会对副本进行修改——然后当你到达循环体的末尾时,副本就会被丢弃。

在你的情况下,你想说:

for (auto& device : devices) { ... }

"&"这里的意思是"给我一个设备的参考"。现在,"设备"指的是向量中的实际元素(而不是它的副本),因此对它所做的任何更改都是对原始设备所做的。