我正在学习矢量。我尝试实现一个打印向量的struct元素的代码,如下所示。互联网上的许多资源只教我一个简单的向量。我打算在打印它时表达不安。但是,任何提高代码质量和优雅的建议都是公开的,尽管这种变化是基本的(在结构或循环中)。
非常感谢。
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
typedef struct _student {
string name;
int age;
vector <string> subject;
}student;
int _tmain(int argc, _TCHAR* argv[])
{
vector <student> x; //assmue at this point we do not know the number of students
student y;
//and I want to insert new information
y.name ="John";
y.age =9;
y.subject.push_back("biology");
y.subject.push_back("math");
y.subject.push_back("art");
x.push_back(y);
//get new information again
//and I want to insert new information
y.name ="Bon";
y.age =12;
y.subject.push_back("history");
y.subject.push_back("physics");
x.push_back(y);
// then I want display all data
cout << "myvector contains:";
for (int i=0; i<x.size(); i++)
{
cout << "Student # " << i+1 <<endl;
cout << " name : " << x.at(i).name <<endl; //Reference in the internet only display a simple vector --
cout << " age : " << x.at(i).age <<endl; //I get stuck to express this and next part
cout <<" Subject : ";
for (int j =0; j < x.at(i).subject.size(); j++)
{
cout << x.at(i).subject.at(j);
}
cout << endl;
cin.get();
return 0;
}
答案 0 :(得分:2)
在这里,添加了一些评论和内容。不确定这是不是你想要的,但现在就是。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string> // string would be welcome here!
struct _student // the typedef thing is not necessary in C++
{
std::string name; // i find this "using namespace ..." thing a bad habit, it can make code harder to read
int age;
std::vector<std::string> subject;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<student> x;
student y;
size_t size; // calling vector.size() every iterations is a bad idea, performance-wise
size_t size_subj; // same
y.name = "John";
y.age = 9;
y.subject.push_back("biology");
y.subject.push_back("math");
y.subject.push_back("art");
x.push_back(y);
y.name = "Bon";
y.age = 12;
y.subject.clear(); // clear subjects of the other student
y.subject.push_back("history");
y.subject.push_back("physics");
x.push_back(y);
std::cout << "my vector contains:";
for (int i = 0, size = x.size(); i < size; ++i)
{
size_subj = x[i].subject.size();
// I prefer using operator[] when I'm sure nothing can go wrong
std::cout << "Student # " << i + 1 <<endl;
std::cout << "\tname: " << x[i].name <<endl;
std::cout << "\tage: " << x[i].age <<endl;
std::cout << "\tSubjects: ";
for (int j = 0; j < size_subj; ++j)
std::cout << x[i].subject[j];
std::cout << endl;
}
return 0;
}
最后,使用std :: vector&lt; std :: string *&gt;或者std :: vector&lt;的std :: string&安培; &GT;在性能方面可能是一个更好的想法,取决于你以后计划用它做什么。
答案 1 :(得分:1)
这里没有真正的问题,所以我假设你要求“代码审查” “整洁”的方式当然是创建一个运营商&lt;&lt;这需要你的内在结构。
除此之外,您可能希望使用迭代器来遍历向量 - 这样,您应该能够更改任何其他容器类型的向量,而无需更改打印的循环的东西。
为向量和临时学生使用比x和y更长的变量名。
使用setw每次都以相同的宽度打印字段。
我确信还有很多其他建议。
答案 2 :(得分:0)
正如评论所指出的,事实证明你没有包含string
头文件。