2012-03-22 108 views
-2

在我得到我的公平份額「這是一個鏈接到線程的副本」的答覆,我想說我已經實現了我一直在閱讀StackOverflow和在CPlusPlus網站。問題是我的矢量不會排序。我在執行過程中必須缺少一些東西。也許錯誤地使用引用等排序向量類

這裏有:我有兩個類 - DETargetParam和一個名爲DETargetParamVector的包裝類,它包含一個類型爲DETargetParam的STL向量。我的目標是使用DETargetParam的fitness成員變量以升序排列std :: vector。我試圖通過重載DETargetParam類中的less運算符並返回一個布爾結果來實現這一點。

但是,這並沒有排序。一切都完美地編譯和執行,但沒有任何排序。我真的希望這裏有人能幫助我。

這是DETargetParam源代碼:

#ifndef _DE_TARGET_PARAM_H_DP_ 
#define _DE_TARGET_PARAM_H_DP_ 

template <typename T, unsigned int N> 
class DETargetParam { 
private: 
    /** The array of N parameters in type T */ 
    T param[N]; 
    long double fitness; 
    long double probability; 
    long double probabilityInterval; 

public: 
    /** 
    * @brief Default constructor. 
    * 
    * Nada! 
    */ 
    DETargetParam() { 
    /* NULL */ 
    } 

    long double getFitness() { 
    return fitness; 
    } 

    void setFitness(long double x) { 
    fitness = x; 
    } 

    long double getProbability() { 
    return probability; 
    } 

    void setProbability(long double x) { 
    probability = x; 
    } 

    long double getProbabilityInterval() { 
    return probabilityInterval; 
    } 

    void setProbabilityInterval(long double x) { 
    probabilityInterval = x; 
    } 

    bool operator<(const DETargetParam& rhs) const { 
    return (fitness < rhs.fitness); 
    } 

    T& operator[](unsigned int i) { 
    return param[i]; 
    } 
}; 

#endif // _DE_TARGET_PARAM_H_DP_ 

和DETargetParamVector包裝類:

#ifndef _DE_TARGET_PARAM_VECTOR_H_DP_ 
#define _DE_TARGET_PARAM_VECTOR_H_DP_ 

#include <algorithm> 
#include <cstdio> 
#include <vector> 

#include "DETargetParam.h" 

template <typename T, unsigned int N, unsigned int NP> 
class DETargetParamVector { 
private: 
    /** This is a STL vector holding the parameters */ 
    std::vector< DETargetParam<T, N> > vec; 

public: 
    /** 
    * @brief Default constructor 
    * 
    * Move along... nothing to see here. 
    */ 
    DETargetParamVector() { 
    vec.reserve(NP); 
    } 

    void SortAndCalculate() { 
    SortVector(); 
    PrintSorted(); 
    } 

    void SortVector() { 
    std::sort(vec.begin(), vec.end()); 
    } 

    void PrintSorted() { 
    for (unsigned int i = 0; i < NP; ++i) { 
     fprintf(stdout, "%.12Lf, %.12Lf, %.12Lf\n", vec[i].getFitness(), vec[i].getProbability(), vec[i].getProbabilityInterval()); 
    } 

    fprintf(stdout, "\n"); 

    fflush(stdout); 
    } 

    DETargetParam<T, N>& operator[](unsigned int i) { 
    return vec[i]; 
    } 
}; 

#endif // _DE_TARGET_PARAM_VECTOR_H_DP_ 

和主功能的詳細信息:

#include <cmath> 
#include <ctime> 

#include "DETargetParamVector.h" 

const unsigned int N = 10; 
const unsigned int NP = 10; 

int main() { 
    srand(time(0)); 

    DETargetParamVector<long double, N, NP> targetVector; 

    // For each member of the population. 
    for (unsigned int i = 0; i < NP; ++i) { 
    targetVector[i].setFitness(static_cast<long double>(rand())); 
    } 

    targetVector.SortAndCalculate(); 

    return 0; 
} 

預先感謝。

+0

我看到一個'SortVector'方法,但我看不到你在任何地方調用它。 – 2012-03-22 12:58:10

+0

我初始化了一個DETargetParamVector變量並在主方法中調用了SortAndCalculate()。 – sudosensei 2012-03-22 13:01:28

+2

你的代碼實際上並沒有將任何東西放入向量中,所以沒有東西可以排序。如果補充說明,代碼應該可以工作。如果沒有,請創建一個完整的可編譯樣本,其中包含您描述的問題。 – 2012-03-22 13:15:06

回答

4

您的矢量確實排序。問題是你的矢量是空的,你所做的只是在矢量之外進行編寫和讀取。

/** 
    * @brief Default constructor 
    * 
    * Move along... nothing to see here. 
    */ 
    DETargetParamVector() { 
    vec.reserve(NP); 
    } 

該評論頗具諷刺意味,因爲這是您的錯誤。 vec.reserve(NP)不會更改矢量的大小,它只是在將來節省工作。您需要調整大小來替代儲備,甚至更好只是從一開始初始化:

/** 
    * @brief Default constructor 
    * 
    * Move along... nothing to see here. 
    */ 
    DETargetParamVector() : vec(NP) { 
    } 

在一個側面節點,這樣的:

int N = 10; 
int NP = 10 * N; 

int main() { 
    DETargetParamVector<long double, N, NP> targetVector; 

是非法的,因爲你有非const int類型的模板參數。您需要將int N替換爲int const N(同樣適用於NP)。

1

我已經放在一起簡化版本的代碼,至少可以生成和排序一些對象。我也(至少IMO)修復了你的設計讓我感到有些問題的幾個地方(雖然結果仍然遠遠不夠完美,至少IMO)。

de_target_param.h:

#ifndef _DE_TARGET_PARAM_H_DP_ 
#define _DE_TARGET_PARAM_H_DP_ 

#include <iostream> 

template <typename T, unsigned int N> 
class DETargetParam { 
private: 
    /** The array of N parameters in type T */ 
    // T param[N]; 
    long double fitness; 
    // long double probability; 
    // long double probabilityInterval; 

public: 
    DETargetParam(long double f) : fitness(f) { } 
    /* 
    long double getFitness() { 
    return fitness; 
    } 

    void setFitness(long double x) { 
    fitness = x; 
    } 

    long double getProbability() { 
    return probability; 
    } 

    void setProbability(long double x) { 
    probability = x; 
    } 

    long double getProbabilityInterval() { 
    return probabilityInterval; 
    } 

    void setProbabilityInterval(long double x) { 
    probabilityInterval = x; 
    } 
    */ 
    friend std::ostream &operator<<(std::ostream &os, DETargetParam const &d) { 
     return os << d.fitness; 
    } 

    bool operator<(const DETargetParam& rhs) const { 
     return (fitness < rhs.fitness); 
    } 
}; 

#endif // _DE_TARGET_PARAM_H_DP_ 

de_target_param_vector.h:

#include "de_target_param.h" 

#ifndef _DE_TARGET_PARAM_VECTOR_H_DP_ 
#define _DE_TARGET_PARAM_VECTOR_H_DP_ 

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

template <typename T, unsigned int N, unsigned int NP> 
class DETargetParamVector { 
    std::vector< DETargetParam<T, N> > vec; 
public: 
    void push(DETargetParam<T, N> const &d) { 
     vec.push_back(d); 
    } 

    void SortAndCalculate() { 
     SortVector(); 
     std::cout << *this; 
    } 

    void SortVector() { 
     std::sort(vec.begin(), vec.end()); 
    } 

    friend std::ostream &operator<<(std::ostream &os, DETargetParamVector const &d) { 
     std::copy(d.vec.begin(), d.vec.end(), std::ostream_iterator<DETargetParam<T, N> >(os, "\n")); 
     return os; 
    } 
}; 

#endif // _DE_TARGET_PARAM_VECTOR_H_DP_ 

而且,我已經寫了創建,排序和打印,(排序順序)某些對象小main

#include "de_target_param_vector.h" 

int main() { 

    DETargetParamVector<int, 1, 5> params; 

    for (int i=0; i<5; i++) 
     params.push(rand()); 

    params.SortAndCalculate(); 
    return 0; 
} 

根據你如何設計你的DETargetParam c對於「僞面向對象」或類似的東西,我認爲一些谷歌搜索應該會出現一些有用的相關閱讀。很多你的代碼似乎(至少對我來說)來說明這個流派。