2015-10-22 35 views
0

我有兩個向量。第一個是一些類的對象的向量。第二個是元素指向第一個向量的對象的向量。向量的指向另一個向量的對象的指針 - 初始化和排序

我有兩個問題給你。第一個是:有更好或更優雅的方式來聲明和初始化指針向量?

第二個解釋更復雜一點。假設我想按降序查看第一個向量的元素。我所要做的就是讓運營商<超載並對它們進行分類。那麼,現在假設我想按降序查看第一個向量的元素,而不改變其元素的順序,但只能在第二個向量的幫助下進行。換句話說,我想對第二個向量的元素進行排序,查看它們指向的內容,而不是像往常一樣查看它的元素,因爲它們是地址。我該怎麼辦?用其他類型的參數重載運算符<?將另一個訂單功能傳遞給sort

我給你Minimal, Complete, and Verifiable exampleg++ -std=c++11 -o example example.cpp編譯。

example.ccp

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

class MyClass{ 
    public: 
     int a; 
     int b; 
     MyClass(int a, int b) : a(a), b(b){}; 
     bool operator<(const MyClass &obj)const{return (this->a + this->b) < (obj.a + obj.b);}; 
}; 

int main(int argc, char* argv[]){ 
    std::vector<MyClass> vector1; 
    vector1.push_back({4, 5}); 
    vector1.push_back({5, 6}); 
    vector1.push_back({6, 7}); 
    vector1.push_back({1, 2}); 
    vector1.push_back({2, 3}); 
    vector1.push_back({3, 4}); 

    std::vector<MyClass*> vector2; 
    std::vector<MyClass>::iterator i; 
    for(i = vector1.begin(); i != vector1.end(); i++) 
     vector2.push_back(&(*i)); 

    std::cout << "element pointed to by vector2 unsorted: " << std::endl; 
    for(int j = 0; j < vector2.size(); j++) 
     std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;   

    /* Insert here how I should sort vector2 */ 
    // std::sort (vector2.begin(), vector2.end()); <-- Obviously this doesn't work 

    std::cout << "element pointed to by vector2 sorted: " << std::endl; 
    for(int j = 0; j < vector2.size(); j++) 
     std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;  


    return 0; 
} 
+2

我不認爲你想這樣做。任何導致'vector1'重新分配的東西都會打破'vector2' – NathanOliver

+0

第二個向量可能是* indices *的向量而不是指針。 –

+0

我需要這樣做,因爲在我的項目中,vector1中有很多元素,它們也是相對較大的類型。 我認爲如果vector1被const值填充,你說的問題就解決了。 – giusva

回答

1

這聽起來好像第一載體是一個紅色的鯡魚,這將做到:

bool compare(const MyClass* lhs, const MyClass* rhs) 
{ 
    return *lhs < *rhs; 
} 

std::sort (vector2.begin(), vector2.end(), compare); 

在修改的情況下更穩定的變體vector1是存儲索引而不是指針:

std::vector<size_t> vector2(vector1.size()); 
std::iota(vector2.begin(), vector2.end(), 0); 

std::sort (vector2.begin(), 
      vector2.end(), 
      [&](int l, int r) { return vector1[l] < vector1[r]; }); 

std::cout << "element pointed to by vector2 sorted: " << std::endl; 
for(int j = 0; j < vector2.size(); j++) 
    std::cout << vector1[vector2[j]].a << " " << vector1[vector2[j]].b << std::endl; 
+0

是的,如果你用'MyClass *'替換'int *',這會起作用。 – giusva

+0

可以在類MyClass中的第一個解決方案中實現該函數嗎? – giusva