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 に答える