Search code examples
c++c++17structured-bindings

Using structure binding to change the value of a custom structure


I am trying to find out a way to change the value of a custom structure using structured binding .I was able to do with std::map.I referred few materials from Structured binding

In the below code I was able to change the value of a map . I want to change the value of unsigned salary from defaulted 1000 to 10000

#include<iostream>
#include<string>
#include<vector>
#include<map>

struct employee {
    unsigned id;
    int roll;
    std::string name;
    std::string role;
    unsigned salary=1000;
};
int main()
{
   std::map<std::string, int> animal_population {
        {"humans", 10},
        {"chickens", 11},
        {"camels", 12},
        {"sheep", 13},
    };
    std::cout<<"Before the change"<<'\n';
    for (const auto &[species, count] : animal_population)
    {
        std::cout << "There are " << count << " " << species
        << " on this planet.\n";
    }
    for (const auto &[species, count] : animal_population)
     {
        if (species=="humans")
        {
            animal_population[species]=2000;
        }

     }
     std::cout<<"After the change"<<'\n';
     for (const auto &[species, count] : animal_population)
     {
            std::cout << "There are " << count << " " << species
            << " on this planet.\n";
     }

    std::vector<employee> employees(4);
    employees[0].id = 1;
    employees[0].name = "hari";
    employees[1].id = 2;
    employees[1].name = "om";


    for (const auto &[id,roll,name,role,salary] : employees) {
        std::cout << "Name: " << name<<'\n'
        << "Role: " << role<<'\n'
        << "Salary: " << salary << '\n';
    }

}

Output

Before the change
There are 12 camels on this planet.
There are 11 chickens on this planet.
There are 10 humans on this planet.
There are 13 sheep on this planet.
After the change
There are 12 camels on this planet.
There are 11 chickens on this planet.
There are 2000 humans on this planet.
There are 13 sheep on this planet.
Name: hari
Role: 
Salary: 1000
Name: om
Role: 
Salary: 1000
Name: 
Role: 
Salary: 1000
Name: 
Role: 
Salary: 1000

Change I tried to get expected output

Error I got

Cannot assign to variable 'salary' with const-qualified type 'const int'

for (const auto &[id,roll,name,role,salary] : employees) {
    //employees[].salary = 10000; //not working
    // salary = 10000;            //not working
    std::cout << "Name: " << name<<'\n'
    << "Role: " << role<<'\n'
    << "Salary: " << salary << '\n';
}

Expected Output

Before the change
There are 12 camels on this planet.
There are 11 chickens on this planet.
There are 10 humans on this planet.
There are 13 sheep on this planet.
After the change
There are 12 camels on this planet.
There are 11 chickens on this planet.
There are 2000 humans on this planet.
There are 13 sheep on this planet.
Name: hari
Role: 
Salary: 10000
Name: om
Role: 
Salary: 10000
Name: 
Role: 
Salary: 10000
Name: 
Role: 
Salary: 10000

Thanks in Advance for any solution and suggestion


Solution

  • Problem is that your values have const cvalifier. They are unmodificable.

    Remove const and use reference & so you can modify these variables.

    for (auto &[id,roll,name,role,salary] : employees) {
        salary = 10000;
        std::cout << "Name: " << name<<'\n'
        << "Role: " << role<<'\n'
        << "Salary: " << salary << '\n';
    }