2011-01-26 56 views
0

我正在通過Accelerated C++中的示例工作。 其中一個問題是要求讀者將通過考試的學生的記錄複製到名爲學生的媒介的開頭。 fgrade是其他地方定義的函數,返回失敗的學生。 然後人們必須使用resize函數從學生中刪除額外的元素,所以它只包含那些通過。 我試過這段代碼,但它不起作用。任何人都可以告訴我,如果錯誤在於下面的代碼?關於將元素插入向量的C++問題

#include "stdafx.h" 
#include <vector> 
#include "Student_info.h" 
#include "grade.h" 

using std::vector; 

// second try: correct but potentially slow 
vector<Student_info> extract_fails(vector<Student_info>& students) 
{ 
    vector<Student_info> fail; 
#ifdef _MSC_VER 
    std::vector<Student_info>::size_type i = 0; 
    std::vector<Student_info>::size_type count = 0; 
#else 
    vector<Student_info>::size_type i = 0; 
    vector<Student_info>::size_type count = 0; 
#endif 

    while (i != students.size()) { 
     if (!fgrade(students[i])) { 
      students.insert(students.begin(), students[i++]); 
      count++; 
     } 
     i++; 
    } 
    students.resize(count); 
    return students; 
} 
+0

你的循環中你有兩次i ++,因此你的代碼將跳過所有奇怪的學生。如果students.size()不是偶數,循環將永遠存在。 – Artium 2011-01-26 10:24:50

+0

在這種狀態下,您將一名學生帶入向量中,並且如果條件匹配,則將_same_學生插入向量中。所以你有兩次在向量中...也許你需要使用'失敗'向量... – 2011-01-26 10:27:43

+0

修改vector_as真的是一個好主意_as你迭代它_?特別是因爲你使用索引來通過每個學生,複製通過的學生到矢量的開頭,你依靠那裏的重複`i ++`來保存你的燻肉。如果是我,我只會使用第二個向量。 – sarnold 2011-01-26 10:28:18

回答

0

您在循環中增加了兩次i

一個很酷的方式做到這一點是使用自定義的謂詞std::sort

bool CompareStudentsByFailure(const Student_info & left, 
           const Student_info & right) { 
    return fgrade(left) > fgrade(right); 
} 

,然後用它是這樣的:

std::sort(students.begin(), students.end(), CompareStudentsByFailure); 
students.resize(std::distance(students.begin(), 
       std::find_if(students.rbegin(), 
          students.rend(), fpgrade).base())); 

然而,Jon`s answer有點簡單。

0

As Space_C0wb0y和Artium指出,你增加了兩倍。此外,你聲明矢量失敗,但從來沒有使用它(除非你以後用它做什麼)。另外,函數中的宏看起來像是矯枉過正 - 它基本上說了同樣的事情兩次(減去「std ::」),你可能只是使用整數 - 更容易讓下一個人閱讀和理解。

1

您可以從標準::算法的remove_if使用,但仿函數應該返回那些未通過人(f_not_grade),而不是具有人傳:

std::remove_if(students.begin(), students.end(), f_not_grade) 

或者你可以看的方式否定函子herehere以使用不帶修改的f_grade函數和remove_if。

容器的大多數常見操作都是在STL中實現的,所以請使用語言的力量!花一些時間尋找這種功能使我們編碼更少,更好。

編輯刪除不正確的「()」。