我想知道如何使用push_back
方法
struct subject
{
string name;
int marks;
int credits;
};
vector<subject> sub;
那么现在我该如何添加元素?
我有初始化字符串名称(主题名称)的函数
void setName(string s1, string s2, ...... string s6)
{
// how can i set name too sub[0].name= "english", sub[1].name = "math" etc
sub[0].name = s1 // gives segmentation fault; so how do I use push_back method?
sub.name.push_back(s1);
sub.name.push_back(s2);
sub.name.push_back(s3);
sub.name.push_back(s4);
sub.name.push_back(s6);
}
函数调用
setName("english", "math", "physics" ... "economics");
答案 0 :(得分:80)
创建vector,push_back元素,然后将其修改为:
struct subject {
string name;
int marks;
int credits;
};
int main() {
vector<subject> sub;
//Push back new subject created with default constructor.
sub.push_back(subject());
//Vector now has 1 element @ index 0, so modify it.
sub[0].name = "english";
//Add a new element if you want another:
sub.push_back(subject());
//Modify its name and marks.
sub[1].name = "math";
sub[1].marks = 90;
}
您无法使用[#]访问向量,直到该索引处的向量中存在元素。此示例填充[#],然后再修改它。
答案 1 :(得分:44)
如果您想使用新的当前标准,您可以这样做:
sub.emplace_back ("Math", 70, 0);
或
sub.push_back ({"Math", 70, 0});
这些不需要subject
的默认构造。
答案 2 :(得分:8)
您不能通过下标访问空向量的元素
始终检查向量是否为空&amp;在[]
上使用std::vector
运算符时,索引有效
[]
如果不存在则不添加元素,但如果索引无效,则会导致未定义行为。
您应该使用vector::push_back()
subject subObj;
subObj.name = s1;
sub.push_back(subObj);
答案 3 :(得分:5)
您也可以使用支持初始化列表中的聚合初始化来处理这类情况。
#include <vector>
using namespace std;
struct subject {
string name;
int marks;
int credits;
};
int main() {
vector<subject> sub {
{"english", 10, 0},
{"math" , 20, 5}
};
}
然而,有时候,结构的成员可能不那么简单,所以你必须让编译器去推断它的类型。
所以延伸到上面。
#include <vector>
using namespace std;
struct assessment {
int points;
int total;
float percentage;
};
struct subject {
string name;
int marks;
int credits;
vector<assessment> assessments;
};
int main() {
vector<subject> sub {
{"english", 10, 0, {
assessment{1,3,0.33f},
assessment{2,3,0.66f},
assessment{3,3,1.00f}
}},
{"math" , 20, 5, {
assessment{2,4,0.50f}
}}
};
}
如果没有括号初始化程序中的assessment
,编译器在尝试推断类型时将失败。
以上是用c ++ 17中的gcc编译和测试的。然而它应该从c ++ 11开始工作。在c ++ 20中,我们可以看到指示符语法,我希望它将允许以下
{"english", 10, 0, .assessments{
{1,3,0.33f},
{2,3,0.66f},
{3,3,1.00f}
}},
来源:http://en.cppreference.com/w/cpp/language/aggregate_initialization
答案 4 :(得分:2)
在查看了可接受的答案之后,我意识到,如果知道所需向量的大小,那么我们就必须使用循环来初始化每个元素
但是我发现使用default_structure_element可以做到这一点很新,如下所示...
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef struct subject {
string name;
int marks;
int credits;
}subject;
int main(){
subject defualt_subject;
defualt_subject.name="NONE";
defualt_subject.marks = 0;
defualt_subject.credits = 0;
vector <subject> sub(10,defualt_subject); // defualt_subject to initialize
//to check is it initialised
for(ll i=0;i<sub.size();i++) {
cout << sub[i].name << " " << sub[i].marks << " " << sub[i].credits << endl;
}
}
然后我认为初始化结构的向量的方法很好,不是吗?