2011-04-11 82 views
1

我想用C++編寫一些東西,儘管我有這個想法並且我試圖寫它,但是我不知道如何去做。根據屬性將矢量劃分爲更小的矢量

說明

想象一下,我有一個vector<int>我們定義eveytime我們運行我們的程序。它的名字是mainVector這個向量將有一個隨機的整數。每個int都有一個屬性。

例如,我們具有以下值的向量:vector<int> mainVector {1, 3, 15, 33, 35, 42, 57, 69, 73}; 和我們有另一個vector<int>在元素的位置,這說明在mainVector每個元素的屬性,稱爲properties例如:vector<int> properties {1, 1, 1, 2, 2, 2, 3, 3, 3}

我現在想,是因爲許多較小的載體不同來劃分第一矢量屬性存在。例如,在最後一種情況下,我將有三個新的向量:具有屬性1的元素的向量:1, 3, 15;矢量元素與屬性2:33, 35, 42;以及具有屬性3的元素的矢量:57, 69, 73

問題是我不知道如何定義這個,導致每次執行我們的代碼時第一個矢量都可能不同。

這裏我重視你的代碼與我的想法:

do 
{ 
    for(int t=0;t<mainVector.size();t++) // id tables 
    { 
     string Vect("Vector"); 
     Vect +=t; 
     vector<int> Vect 

     for(int u=0;u<mainVector.size();u++) 
     { 
      if(properties.at(u) & t) 
      { 
       Vect.push_back(mainVector.at(u)); // I know this is not correct but I hope you understand what I mean 
      } 
     } 
    } 
} 

在此先感謝大家! :)

澄清

重要的東西,我想澄清:mainVector已經是已被定義多虧了開關輸入的另一大的向量的子向量。 bigVector <int>{1, 2, 3, 4, 5, 6, ...., 99, 100, 101, ..., n}vector <int> properties是一個向量,實際上,它是一個大的向量,它可以在任何情況下有所不同,例如,在一次執行中,我可以是{1, 1, 1, 1, 1, 1, ..., 1, 1, 2, ... 2},另一個時刻{1, 1, 1, 1, 2, 2, ..., 26, 26, 27, 49},所以我認爲我不能做一個向量像一些你正在推薦的矢量,任何想法?

再次感謝!!!

回答

2

您可以計算「屬性」向量中不同類型的數量並創建向量向量(vector<vector<int>>)。然後循環第二個向量並將第一個向量的點添加到新向量結構的相應索引中。

喜歡的東西:

bool Contains(vector<int> x, int value) 
{ 
    bool bContains = false; 
    for(int ii=0; ii<x.size(); ++ii) 
    { 
     if(x[ii] == value) 
     { 
      bContains = true; 
      break; 
     } 
    } 

    return bContains; 
} 

int GetIndex(vector<int> x, int value) 
{ 
    int nIdx = -1; 
    for(int ii=0; ii<x.size(); ++ii) 
    { 
     if(x[ii] == value) 
     { 
      nIdx = ii; 
      break; 
     } 
    } 

    return nIdx; 
} 

int main() 
{ 
    const int SIZE=10; 

    vector<int> x(SIZE); 
    vector<int> y(SIZE); 
    for(int ii=0; ii<SIZE; ++ii) 
    { 
     x[ii] = ii*SIZE+4; 

     if(ii < SIZE/2) 
      y[ii] = 0; 
     else 
      y[ii] = ii/3; 
    } 

    vector<int> unique(SIZE, -1); 
    int nCount = 0; 
    for(int ii=0; ii<y.size(); ++ii) 
    { 
     if(!Contains(unique, y[ii])) 
      unique[nCount++] = y[ii]; 
    } 
    unique.resize(nCount); 

    vector<vector<int>> answer(nCount); 
    for(int ii=0; ii<y.size(); ++ii) 
     answer[GetIndex(unique, y[ii])].push_back(x[ii]); 

    return 0; 
} 
+0

感謝您的回答。我剛剛澄清了我的問題,因爲我認爲我不能用矢量>來推薦。看看並告訴我,如果你有任何想法如何做到這一點!謝謝:) – thomas 2011-04-11 14:38:55

+0

我仍然認爲矢量向量應該工作。你能否嘗試再次修改它......描述你想要對數據做什麼?你想用這個新的子向量「對象」來做什麼? – Jess 2011-04-11 15:22:26

+0

我已經編輯上面的解決方案...不知道這是你在找什麼? – Jess 2011-04-11 16:31:50

0

您可以使用int的載體的載體,那就是vector< vector<int> >

+0

感謝您的回答。我剛剛澄清了我的問題,因爲我認爲我不能用矢量>來推薦。看看並告訴我,如果你有任何想法如何做到這一點!謝謝:) – thomas 2011-04-11 14:39:49

0

這聽起來像你應該要麼使包含自定義類或對

vector<pair<int, int> >

的矢量這將允許您無需屬性越來越不匹配的可能性排序向量的向量。

+0

感謝您的回答。我剛剛澄清了我的問題,因爲我認爲我不能按照您的建議使用>。看看並告訴我,如果你有任何想法如何做到這一點!謝謝:) – thomas 2011-04-11 14:40:17

0

您可以設置mapintvector<int>,其中鍵是屬性的值,值是包含具有該屬性的所有元素的子向量。

+0

感謝您的回答。我剛剛澄清了我的問題,因爲我認爲我不能用int從地圖到矢量 /實際上,我從來沒有使用過地圖,儘管我已經嘗試過,但我從來沒有得到我想要的東西。 :S看看我的說明並告訴我你是否有任何想法如何做到這一點!謝謝:) – thomas 2011-04-11 14:41:31

0

有些算法可以用來做你想做的事情。

如果你想使所有元素的副本mainVector到另一個向量results滿足謂語,而留下mainVector不變,你可以使用copy_if

copy_if(mainVector.begin(), mainVector.end(), back_inserter(results), MyPredicate()); 

如果你想要做同樣的如上述,除了從mainVector除去這些項目,那麼你可以使用remove_copy_if

mainVector.erase4(copy_if(mainVector.begin(), mainVector.end(), back_inserter(results), MyPredicate()), mainVector.end()); 
2

你可以使用一個std::map<int, std::vector<int>>跟蹤每個道具以及與該財產相關的數字。例如:

typedef std::vector<int> vec_t; 
typedef std::map<int, vec_t> map_t; 

// the real work 
map_t propMap; 
for (vec_t::size_type i = 0u, i_end = mainVector.size(); i != i_end; ++i) 
    propMap[properties[i]].push_back(mainVector[i]); 

// printing the results 
for (map_t::const_iterator miter = propMap.begin(), miter_end = propMap.end(); 
     miter != miter_end; 
     ++miter) 
{ 
    std::cout << "all numbers with property value of " << miter->first << ':'; 
    for (vec_t::const_iterator viter = miter->second.begin(), viter_end = miter->second.end(); 
      viter != viter_end; 
      ++viter) 
    { 
     std::cout << ' ' << *viter; 
    } 
    std::cout << std::endl; 
} 

打印(對於你已經給出的實例中的數據):33 35:1 3 15
具有2屬性值的所有數字:

具有1屬性值的所有數字42
所有具有屬性值3的數字:57 69 73

+0

感謝您的回答。它看起來相當複雜,我的初始C++水平,但我想我已經明白了。無論如何,我剛剛澄清了我的問題,你能否檢查它,並告訴我,如果你認爲你的答案仍然有效?這是一個更簡單的方式來寫它?提前致謝! :) – thomas 2011-04-11 14:45:44

+0

@thomas:這裏唯一的要求是'mainVector'和'properties'具有相同的長度。除此之外,我不確定你所做的所有澄清的變化...... – ildjarn 2011-04-11 14:52:02

+0

@thomas:另外請注意,實際創建新向量的代碼只有3行(真實工作評論)。 3條線是否真的需要進一步簡化? ; - ](其餘代碼用於打印結果,因此其複雜程度似乎不相關)。 – ildjarn 2011-04-11 14:59:14