2015-10-29 2 views
0

Я следующий код (найден в this link here):C++ изменение значения структур внутри вектора, то есть внутри структуры, которая находится внутри другого вектора

// 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!!! code ...

Есть ли специальный способ установить значения структур внутри вектора внутри структуры, находящейся внутри вектора? Я что-то упустил?

Я использую C++ 11, gcc linux.

Спасибо за помощь.

ответ

5

Если у вас есть что-то вроде этого:

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

Это Перебирает все значения DeviceStruct в векторе устройств. Однако «автоустройство» означает «дайте мне копию элемента».

После того, как вы сделаете это, любые сделанные вами изменения будут сделаны для этой копии, которая затем отбрасывается, когда вы дойдете до конца вашего тела цикла.

В вашем случае, если вы хотите сказать:

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

«&» здесь означает «дать мне ссылку на устройство». Теперь «устройство» относится к фактическому элементу внутри вектора (а не к его копии), поэтому любые изменения, внесенные в него, выполняются на исходном устройстве.

+0

Очистить и очень хорошо объяснить .... Спасибо. – Mendes

Смежные вопросы