我想用类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;
}
答案 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
类中进行了一些小的更改,这些更改是,id
以member 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)
,此处first
和last
必须满足LegacyInputIterator
。
现在导入点就是该语句的工作方式,
std::vector<Student> students( ids.begin(), ids.end());
是因为*first
(std::vector< std::string>
的迭代者)将给出一个std::string
值,但是students
是std::vector<Student>
类型并且需要Student
个对象进行初始化。
因为Student
类构造器不是explicit
构造函数,并且由于此std::string
隐式可转换为Student
,所以成为可能。
输出:a, b, c,