打印矢量的结构元素

时间:2012-12-21 01:30:10

标签: c++ visual-studio-2010

我正在学习矢量。我尝试实现一个打印向量的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;
}

3 个答案:

答案 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头文件。