2015-10-23 117 views
1

我是新来的向量和新的类。那么,我发现了一些关于如何创建对象向量的文章。我想知道如何从用户输入创建对象向量?假设程序要求用户提供他/她想要创建的员工数量(班级)。用户想要添加5名员工。因此,用户必须输入员工的姓氏和名字。我有一个for循环,但我不知道如何去抓取用户输入(也许使用getline和push_back?)并将其存储在向量中。C++使用用户输入填充对象的矢量

//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; 
} 
+0

'的std :: cin'或'的std :: getline'和'的std :: VECTOR'应该这样做。 – Downvoter

+0

基本技巧是将大问题分解为子问题。例如为你的程序设计一个循环,这种方式绝对不会引用*你如何获得用户输入,就像你所做的一样,同样也没有提及*你如何创建一个Employee对象,将它存储在一个矢量中。 – Hurkyl

回答

3

Employee类应该有一个构造。在收集输入时,您需要所有的构造函数参数。然后,要将Employee添加到vector<Employee>,请致电employees.emplace_back(ctor-arguments)

+0

我用C#开发,只知道C++ 98是用于ACM竞赛的程序语言。你能解释一下 - 使用'emplace_back'还是实例化一个对象然后应用'push_back'有什么区别?谢谢。 –

+0

@YeldarKurmangaliyev,它避免了不必要的对象复制。 – SingerOfTheFall

+0

@YeldarKurmangaliyev:它甚至可以防止不必要的_moving_对象。 (如果允许,'push_back'将移动一个对象。) – MSalters

0

其他用户提供了一个很好的例子来解释如何在现代C++中使用emplace_back
如果您使用pre-C++ 11版本,则没有emplace_back方法。在这种情况下,您可以使用旧式push_back手动收集vector中的数据。你可以简单地定义一个矢量:

vector<Employee> employees; 

然后,您可以逐行读取你的数据线,创建新的对象,填补他们根据你的业务逻辑,并追加到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 
    } 
} 

你也可以定义一个构造函数,以firstnamelastname作为参数,以便于使用。

+1

你的意思是'员工雇员;' - 摆脱'新员工()'。 – molbdnilo

+0

@molbdnilo是的,谢谢!只是一个C#习惯:) –

+0

你可能想'push_back(std :: move(employee))'。你不需要本地副本了。 – MSalters

0

std::vector有一个称为emplace_back好的方法,它

追加到容器的端部的新元素。该元素通过std :: allocator_traits :: construct构造,通常使用placement-new在容器提供的位置就地构造元素。

所以你唯一能够使用它的东西是一个合适的构造函数。

#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; 
    } 
} 
+0

由于事先已经在向量中包含了元素的数量,所以最好做一个.reserve :) – bashrc

+0

使用“提前指定大小”模式可能是个坏主意;考虑到我们使用'vector',它并没有提供任何简化......或者,至少,如果您正在进行所有适当的I/O检查,它不会提供任何简化。 – Hurkyl

+0

谢谢!这个构造函数的定义是什么? – ZhangBing

0
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; 
} 

你需要一个构造函数两个字符串作为输入。显然你可以做到这一点,但这会减少冗长。

员工(字符串paramLastName,串paramFirstName): 的lastName(移动(paramLastName)),名字(移动(paramFirstName)){}

您需要调用它以这种方式。

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

(这是假设你将与C++ 11的支持编译)

+0

你不需要'emplace_back'的'{}'。 – MSalters

+0

@MSalters thanx。更新我的回答 – bashrc

+0

您的用户输入逻辑错误;当你检查'std :: cin'时,已经太晚了。 – Hurkyl