是否可以使用将不同参数传递给构造函数的类的不同实例来初始化向量?

时间:2019-06-16 11:33:21

标签: c++

我想用类Student的不同实例初始化矢量学生。因此,如果我想定义一个有3个学生的向量,则可以像代码示例中那样进行操作,但是我遇到的问题是,所有学生都具有相同的ID“ a”。是否可以用不同的ID初始化不同的学生,以便第一个学生的ID为“ a”,第二个学生的ID为“ b”,第三个学生的ID为“ c”,就像在矢量ID中一样?甚至更好,是否可以在不使用setter方法的情况下用不同的向量id元素初始化每个学生? 预先谢谢你。

//Student.h

#ifndef STUDENT_H_
#define STUDENT_H_

#include <string>
using namespace std;

class Student {
private:
    string id;
public:
    Student(string id) {
        this->id = id;
    };
    virtual ~Student() {

    }
};

#endif /* STUDENT_H_ */
//Test.cpp

#include <vector>
#include <string>
#include "Student.h"
using namespace std;

int main() {
    vector<string> ids {"a", "b", "c"};
    vector<Student> students(3, Student("a"));
    return 0;
}

6 个答案:

答案 0 :(得分:3)

您是说以下意思吗?

std::vector<Student> students = { Student( "a" ), Student( "b" ), Student( "c" ) };

答案 1 :(得分:2)

您可以使用@vlad的答案,或者可以这样做

std::vector<Student> students{ std::string( "a" ), std::string( "b" ), std::string( "c" ) };

或在类中添加新的构造函数

    Student(const char* id): id{id} {};

您可以做类似的事情

vector<Student> students2{"a", "b",  "c"};

最后一个问题

  

是否可以使用不同的向量ID元素初始化每个学生而无需使用setter方法?

您可以(如果我理解正确的话)

std::vector<std::string> ids{"d", "e", "f"};
vector<Student> students3;
std::transform(cbegin(ids), cend(ids), std::back_inserter(students3), [](const std::string& id){return Student{id};});

在以下位置播放我的代码:https://onlinegdb.com/SysWTjXyB

答案 2 :(得分:1)

  

甚至更好的是,是否可以使用向量 @override Widget build(BuildContext context) { // TODO: implement build return StreamBuilder( stream: objecta.b, builder: (BuildContext ctx, AsyncSnapshot<int> snap) { return Text((snap.data ?? -1).toString()); }, ); } 的不同元素来初始化每个学生而无需使用setter方法?

使用ids

std::transform

答案 3 :(得分:1)

使用std::for_each可以emplace_back在向量中一对一地学员。

std::vector<std::string> ids {"a", "b", "c"};
std::vector<Student> students;

std::for_each(ids.cbegin(), ids.cend(),
                  [&students](auto id){students.emplace_back(id);});

答案 4 :(得分:0)

您需要使用一个静态成员,该成员将增加到构造函数中。像这样:

class Student {
...
public:
    char GetId() const;
...
private:
    static char id = 'a';
}

别忘了在增加id var之前检查边界条件。 ('a'-'z')

答案 5 :(得分:0)

我在Student类中进行了一些小的更改,这些更改是,idmember initializer开头,并添加了一个名为value()的函数以打印值。另一个更改是,我删除了using namespace std;,因为它被认为是不好的做法。参见下面的代码,

#include <iostream>

#include <string>
#include <vector>

class Student {
private:
    std::string id;
public:
    Student( const std::string& id): id( id)
    {
    }

    virtual ~Student()
    {

    }

    const std::string& value() const noexcept
    {
        return id;
    }
};

int main() {
    std::vector<std::string> ids { "a", "b", "c"};
    std::vector<Student> students( ids.begin(), ids.end());

    std::vector<Student>::iterator it = students.begin();

    while( students.end() != it)
    {
        std::cout<< it->value()<< ", ";
        ++it;
    }

    std::cout<< std::endl;

    return 0;
}

std::vector类具有构造函数

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );

它构造的std::vector的内容范围为[first, last),此处firstlast必须满足LegacyInputIterator
现在导入点就是该语句的工作方式,
std::vector<Student> students( ids.begin(), ids.end());是因为*firststd::vector< std::string>的迭代者)将给出一个std::string值,但是studentsstd::vector<Student>类型并且需要Student个对象进行初始化。
因为Student类构造器不是explicit构造函数,并且由于此std::string隐式可转换为Student,所以成为可能。

输出:a, b, c,