2

我正在学习矢量。我尝试实现一个打印向量的结构元素的代码,如下所示。互联网上的许多资源只教我一个简单的向量。当打印它时,我得到了表达。但是,任何提高代码质量和优雅性的建议都是开放的,尽管更改是基本的(在结构或循环中)。

非常感谢。

#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;
}
4

3 回答 3

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< std::string* > 或 std::vector< std::string& > 在性能方面可能是一个更好的主意,具体取决于您以后打算用它做什么。

于 2012-12-21T01:39:20.977 回答
1

这里没有真正的问题,所以我假设您要求“代码审查”“整洁”的方式当然是创建一个 operator<< 来获取您的内部结构。

除此之外,您可能希望考虑使用迭代器来遍历您的向量 - 这样,您应该能够更改任何其他容器类型的向量,而无需更改打印内容的循环。

为您的向量和临时学生使用比 x 和 y 更长的变量名称。

每次使用 setw 以相同的宽度打印字段。

我相信还有很多其他的建议。

于 2012-12-21T01:38:17.327 回答
0

正如评论所指出的,事实证明您没有包含string头文件。

于 2012-12-21T01:43:54.817 回答