2013-09-29 4 views
0

Приветствую всех, я пишу программу фондового рынка, где я читаю из файла и сортирую с символами и процентом выигрыша/потери. Я закончил сортировку с символами, но не смог установить процентную потерю. В основном мне поручено использовать векторы. Мы должны составить список, упорядоченный по проценту прибыли/убытка, и мне нужно отсортировать список запасов по этому компоненту. Однако я не должен физически сортировать список по проценту процента/потери компонента; вместо этого обеспечивают логический порядок в отношении этого компонента. , так что в основном я добавил элемент данных, вектор для хранения индексов списка запасов, упорядоченных по проценту процента/убытка. Я назвал массив arrayByGain. поэтому, когда я печатаю список, упорядоченный процентным коэффициентом усиления/потери, я использую массив indexByGain для печати списка. моя проблема в том, что мне нужна помощь в том, как начать, если кто-то может показать мне пример или объяснить, как это сделать, я могу продолжить или исправить меня по моему черновику, что будет полезно. У меня есть идея, но голая со мной, так как это черновик. ниже - черновик моего кода. stockType имеет отношение к тому, где данные хранятся в файле.Сортировка с использованием векторов

#include <iostream> 
    #include "stockType.h" 

    class stockListType 
    { 
    public: 
     void sortBySymbols();//sort out symbols and it comiples correctly. 
     void sortByGain(); 
     void printByGain(); 
     void insert(const stockType& item); 
    private: 
    vector<int> indexByGain;//declared a vector array indexByGain.. 
    vector<stockType> list; 
    }; 

    void stockListType::insert(const stockType& item) 
    { 
     list.push_back(item)//inserts the data from file to vector array. 
    } 
     //function prints out the gain 
    void stockListType::printByGain() 
{ 
    //my code to print out the gain.. 
    } 
    //function to sort the gain and this is where i am stuck. 
     void stockListType::sortGain() 
     { 

      int i, j, min, maxindex; 
      for(i=0;i<list.size();i++) 
      { 
      min = i; 
      for(j=i+1;j<list.size();j++) 
       list[maxindex].getPercentage()<list[j].getPercentage(); 
       maxindex = j; 
       indexGain.push_back(maxindex); 
      } 

pls голый как черновик. Я знаю, что я ошибаюсь, но я начинаю с хорошей базы или полностью. пожалуйста, вы могли бы помочь мне или исправить меня. Благодарю. о, жаль, прежде чем я забуду getPercentage() вычисляет и возвращает процентное усиление/потерю.

ответ

2

Инициализировать индекс и использовать станд :: сортировать:

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

int main() 
{ 
    struct Data { 
     int value; 
     int percent; 
    }; 
    typedef std::vector<Data> DataVector; 
    typedef DataVector::size_type size_type; 
    typedef std::vector<size_type> IndexVector; 

    DataVector data { { 1, 1 }, { 2, -2 }, { 3, 3 }, { 4, -4 }, { 5, 5} }; 
    IndexVector index; 
    index.resize(data.size()); 
    for(size_type i = 0; i < data.size(); ++i) { 
     index[i] = i; 
    } 

    struct Less 
    { 
     const DataVector& data; 
     Less(const DataVector& data) 
     : data(data) 
     {} 

     bool operator() (size_type a, size_type b) { 
      return data[a].percent < data[b].percent; 
     } 
    }; 
    std::sort(index.begin(), index.end(), Less(data)); 
    for(size_type i = 0; i < index.size(); ++i) { 
     std::cout << data[index[i]].value << ": " << data[index[i]].percent << std::endl; 
    } 
} 

Вы можете использовать C++ 11:

std::sort(index.begin(), index.end(), 
     [&](size_type a, size_type b) { return data[a].percent < data[b].percent; } 
    ); 
for(auto i: index) 
    std::cout << data[i].value << ": " << data[i].percent << std::endl; 
+0

Просто надо знать, что станд :: сортировать вызывает конструктор копирования базы элемент несколько раз. Если производительность ухудшается, проверьте свой конструктор копирования. – cup

+0

@cup Какой «базовый элемент»? –

Смежные вопросы