私はAccelerated C++を使って作業を進めており、そこに定義されている構造体を使いこなすことに決めました。そうしているうちに、私は問題に遭遇しました。これらの構造体のベクトルを作成し、それぞれの要素を変更することは、それらの要素のすべてを変更するようです。C++:なぜ構造体のベクトルが1つの構造体として機能していますか?
これはおそらく、ベクトルのすべての構造体を単一のメモリアドレスで構造体に初期化したことを意味しますが、私は.push_back()メソッドを使用してベクトルに "ダミー"構造体を挿入しました。私は.push_back()がその引数のコピーをプッシュし、効果的に新しい構造体を作成しているという印象を受けました。ここで
は、構造体のヘッダーです:
#ifndef _STUDENT_INFO__CHAPTER_9_H
#define _STUDENT_INFO__CHAPTER_9_H
#include <string>
#include <iostream>
#include <vector>
class Student_info9{
public:
Student_info9(){homework = new std::vector<double>;};
Student_info9(std::istream& is);
std::string getName() const {return name;};
double getMidterm() const {return midterm;};
double getFinal() const {return final;};
char getPassFail() const {return passFail;};
std::vector<double> *getHw(){return homework;};
void setName(std::string n) {name = n;};
void setMidterm(double m) {midterm = m;};
void setFinal(double f) {final = f;};
private:
std::string name;
double midterm;
double final;
char passFail;
std::vector<double> *homework;
};
#endif /* _STUDENT_INFO__CHAPTER_9_H */
そして、ここでは、私は(いくつかの時間の結果は、デバッグしようと...過度のprint文を言い訳に浮気していたコードです:) ):あなたはprint文で見ることができます
vector<Student_info9> did9, didnt9;
bool did_all_hw9(Student_info9& s)
{
vector<double>::const_iterator beginCpy = s.getHw()->begin();
vector<double>::const_iterator endCpy = s.getHw()->end();
return(find(beginCpy, endCpy, 0) == s.getHw()->end());
}
void fill_did_and_didnt9(vector<Student_info9> allRecords)
{
vector<Student_info9>::iterator firstDidnt = partition(allRecords.begin(), allRecords.end(), did_all_hw9);
vector<Student_info9> didcpy(allRecords.begin(), firstDidnt);
did9 = didcpy;
vector<Student_info9> didntcpy(firstDidnt, allRecords.end());
didnt9 = didntcpy;
}
int main(int argc, char** argv) {
vector<Student_info9> students;
Student_info9 record;
for(int i = 0; i < 5; i++)
{
students.push_back(record);
}
for(int i = 0; i < students.size(); i++)
{
students[i].setMidterm(85);
students[i].setFinal(90);
students[i].getHw()->push_back(90);
std::cout << "student[" << i << "]'s homework vector size is " << students[i].getHw()->size() << std::endl;
students[i].getHw()->push_back(80);
std::cout << "student[" << i << "]'s homework vector size is " << students[i].getHw()->size() << std::endl;
students[i].getHw()->push_back(70);
std::cout << "student[" << i << "]'s homework vector size is " << students[i].getHw()->size() << std::endl;
std::cout << "Just pushed back students[" << i << "]'s homework grades" << std::endl;
if(i == 3)
students[i].getHw()->push_back(0);
}
std::cout << "student[3]'s homework vector size is " << students[3].getHw()->size() << std::endl;
for(vector<double>::const_iterator it = students[3].getHw()->begin(); it != students[3].getHw()->end(); it++)
std::cout << *it << " ";
std::cout << std::endl;
std::cout << "students[3] has " << ((find(students[3].getHw()->begin(),students[3].getHw()->end(), 0) != students[3].getHw()->end()) ? "atleast one " : "no ")
<< "homework with a grade of 0" << std::endl;
fill_did_and_didnt9(students);
std::cout << "did9's size is: " << did9.size() << std::endl;
std::cout << "didnt9's size is: " << didnt9.size() << std::endl;
}
として、宿題の成績は一つだけStudent_info9オブジェクト、ベクトル全体を埋めるように見えるそのコピーに追加されているようです。私は、単一のオブジェクトに対して.push_back()の連続コピーを使用する場合、それぞれが異なるメモリアドレスを持つそのオブジェクトのコピーを作成するという印象を受けました。
私はそれが問題の原因かどうかは分かりませんが、うまくいけば誰かが私を正しい方向に向けることができます。
ありがとうございました。
ところで、これらのヘッダーガードは[illegal](http:// stackoverflow。com/questions/228783/what-are-the-rules-about-an-c-identifierのアンダースコアを使用して) – GManNickG