2015-09-14 73 views
-4

因此,這裏是我的程序出現錯誤:用迭代器解決c2100問題?

// ConsoleApplication42.cpp : Defines the entry point for the console application. 
// 

    #include "stdafx.h" 
    #include <iostream> 
    #include <list> 
    #include <cstdlib> 
    #include <time.h> 
    #include <algorithm> 
    #include <string> 
    #include <vector> 

    using namespace std; 


    const int numberOfStudents = 9; 
    string names[numberOfStudents] = {"Abe","Billy","Carl","Dillan","Eddie","Felix","Gill","Herald","Isaac"}; 

    struct StudentInfo { 
     string name; 
     int grade; 



     bool operator< (int grade){ 
      return grade < grade; 
     } 

     bool operator< (string name){ 
      return name < name; 
     } 
     }; 



    void populateStudentRecords(vector<StudentInfo>Students,vector<int>::iterator iter, int x){ 

     for(auto iter = Students.begin(); iter != Students.end(); ++iter){ 
      iter->name = names[x]; 
      iter->name.push_back(x); 
      iter->grade = x++; 
      x = x++; 

     } 



    } 

    bool sortByName(const StudentInfo x, const StudentInfo y){ 
     return x.name < y.name; 
    } 

    bool sortByGrade(const StudentInfo x, const StudentInfo y){ 
     return x.grade < y.grade; 
    } 

    void displayRecords(vector<StudentInfo>Records,vector<int>::iterator iter){ 
     for(auto iter = Records.begin(); iter != Records.end(); ++iter){ 
      cout<<*iter->name<<" -"<<*iter->grade<<endl; 
     } 
    } 

    void displayMaxAndMinGrade(vector<StudentInfo>Records,vector<int>::iterator iter){ 
     for(auto iter = Records.begin(); iter != Records.end(); ++iter){ 
      cout<<*iter->name<<" - " <<*iter->grade<<endl; 
      iter = Records.end(); 
      cout<<*iter->name<<" - " <<*iter->grade<<endl; 
     } 
    } 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     vector<StudentInfo>Records (numberOfStudents); 
     vector<int>::iterator iter; 


     populateStudentRecords(Records,iter,0); 
     sort(Records.begin(),Records.end(),sortByName); 
     displayRecords(Records,iter); 
     sort(Records.begin(),Records.end(),sortByGrade); 
     cout<<" "<<endl; 
     displayMaxAndMinGrade(Records, iter); 

     return 0; 
    } 

在displayRecords功能和displayMaxAndMin功能,我旁邊的迭代器的*符號。我希望計算機在向量中每次出現結構時顯示這些變量的值。但是,當我嘗試構建程序時,出現錯誤c2100。我試圖運行該程序時不包含*符號,但顯示每個變量的地址並導致崩潰。我該如何解決?謝謝。

+0

據到https:/ /msdn.microsoft.com/en-us/library/bzf3eha6.aspx,c2100表示​​「間接運算符(*)應用於非指針值。」非常好的暗示,你不想*。 – user4581301

回答

1

您需要閱讀關於使用C++進行編程的介紹性書籍。這段代碼充滿了錯誤。你不知道如何使用指針/引用/迭代器。

  1. 瞭解一本好書的複製,參考和指針。請按照本答案末尾的鏈接。
  2. 變量應限制在它們的使用範圍內。當他們不需要他們的時候,不要把這麼多的參數傳遞給你的函數。
  3. 當您只需要一個適用於運算符的類型時,您正在同時使用間接引用運算符和取消引用運算符。這是你錯誤的原因。
  4. 您正在爲每個循環增加一個數組索引兩次,這使得它超出邊界。
  5. 您正在使用容器的end()成員函數,它假定它將一個迭代器返回到容器中的最後一個元素。
  6. 您想要打印最低和最高的等級,但是會遍歷整個容器。

爲你着想,我已經解決了最明顯的錯誤:

#include <iostream> 
#include <list> 
#include <cstdlib> 
#include <time.h> 
#include <algorithm> 
#include <string> 
#include <vector> 

using namespace std; 

const int numberOfStudents = 9; 
string names[numberOfStudents] = { "Billy", "Abe","Carl","Dillan","Eddie","Felix","Gill","Herald","Isaac" }; 

struct StudentInfo 
{ 
    string name; 
    int grade; 
}; 

void populateStudentRecords(vector<StudentInfo>& Students) 
{ 
    int x{ 0 }; 
    for (auto iter = Students.begin(); iter != Students.end(); ++iter) 
    { 
     iter->name = names[x]; 
     iter->name.push_back(x); 
     iter->grade = ++x; 
    } 
} 

bool sortByName(const StudentInfo x, const StudentInfo y) 
{ 
    return x.name < y.name; 
} 

bool sortByGrade(const StudentInfo x, const StudentInfo y) 
{ 
    return x.grade < y.grade; 
} 

void displayRecords(vector<StudentInfo>Records) 
{ 
    for (auto iter = Records.begin(); iter != Records.end(); ++iter) 
    { 
     cout << iter->name << " -" << iter->grade << endl; 
    } 
} 

void displayMaxAndMinGrade(vector<StudentInfo>Records) 
{ 
    auto iter = Records.begin(); 
    cout << iter->name << " - " << iter->grade << endl; 
    iter = Records.end() - 1; 
    cout << iter->name << " - " << iter->grade << endl; 
} 

int main() 
{ 
    vector<StudentInfo>Records(numberOfStudents); 

    populateStudentRecords(Records); 
    sort(Records.begin(), Records.end(), sortByName); 
    displayRecords(Records); 
    sort(Records.begin(), Records.end(), sortByGrade); 
    cout << " " << endl; 
    displayMaxAndMinGrade(Records); 

    return 0; 
} 

請幫自己一個忙,請訪問以下鏈接:

The Definitive C++ Book Guide and List