简体   繁体   中英

C++ Populating a vector of objects with user input

I am new to vectors and new to classes.That being said, I have found some posts about how to create a vector of objects. I want to know how would one go about creating a vector of objects from user input? Say the program asks the user to give the number of employees(class) he/she wants to create. The user wants to add 5 employees. So user must input the employee's last name and first name. I have a for loop in mind but I am not sure how to go about grabbing the user input (Maybe using getline and push_back?) and storing it in the vector.

//Lets say class.h looks like this
class Employee
{
private:
    string lastName;
    string firstName;
public:
    void setLastname(string);
    void setFirstname(string);
    string getLastname() const;
    string getFirstname() const;
}

Your Employee class should have a constructor . When gathering input, you need all the constructor arguments. Then, to add an Employee to a vector<Employee> , call employees.emplace_back( ctor-arguments ) .

Other users have provided a good examples explaining how to use emplace_back in modern C++.
If you work with pre-C++11 versions, there is no emplace_back method. In this case, you can collect data in your vector manually using old-style push_back . You can simply define a vector:

vector<Employee> employees;

Then, you can read your data line by line, create new objects, fill them according to your business logics and append to your vector :

int n;

int main() 
{
    cout << "Enter number of employyes: "; cin >> n;

    for (int i = 0; i < n; i++)
    {
        std::string s;
        Employee employee; // Create object

        cout << "Employee " << i << ". First name: "; cin >> s;
        employee.setFirstname(s); // Fill object

        cout << "Employee " << i << ". Last name: "; cin >> s;
        employee.setLastname(s); // Keep filling it

        cout << "Welcome, " << employee.getFirstname() << " " << employee.getLastname() << endl;
        employees.push_back(employee); // Add to vector
    }
}

You can also define a constructor taking both firstname and lastname as arguments to make it easier to work with.

std::vector has a nice method called emplace_back , which

Appends a new element to the end of the container. The element is constructed through std::allocator_traits::construct, which typically uses placement-new to construct the element in-place at the location provided by the container.

So the only thing you are missing to be able to use it is an appropriate constructor.

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

using namespace std;

class Employee
{
private:
    string firstName;
    string lastName;
public:
    void setLastname(string);
    void setFirstname(string);
    string getLastname() const{return lastName;}
    string getFirstname() const{return firstName;}

    //create a constructor
    Employee(string firstName, string lastName)
        : firstName(firstName), lastName(lastName)
    {}
};

int main()
{
    vector<Employee> emp;
    int count = 0;
    cout << "Enter the amount of employees to add:" << endl;
    cin >> count;

    string firstName, lastName;
    for(int i = 0; i < count; ++i)
    {
        cout << "Please enter the first and last names" << endl;

        cin >> firstName;
        cin >> lastName;

        emp.emplace_back(firstName, lastName);
    }

    for(const Employee & e : emp)
    {
        cout << "Employee:" << endl;
        cout << e.getFirstname() << " " << e.getLastname() << endl;
    }
}
class Employee
{
private:
    string lastName;
    string firstName;
public:
    Employee(string paramLastName, string paramFirstName) : lastName(move(paramLastName)), firstName(move(paramFirstName)) {}
    void setLastname(string);
    void setFirstname(string);
    string getLastname() const;
    string getFirstname() const;
}

You need a constructor that takes two strings as input. Obviously you could do without this but this reduces verbosity.

Employee(string paramLastName, string paramFirstName) : lastName(move(paramLastName)), firstName(move(paramFirstName)) {}

You will need to call it in this way.

vector<Employee> inp;
string tmp1, tmp2;
while(std::cin>>tmp1 >> tmp2) {
    inp.emplace_back(tmp1, tmp2);
}

(This is assuming that you will compile with c++11 support)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM