根据属性将矢量划分为更小的矢量

问题描述:

我想用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},所以我认为我不能做一个向量像一些你正在推荐的矢量,任何想法?

再次感谢!!!

您可以计算“属性”向量中不同类型的数量并创建向量向量(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

您可以使用int的载体的载体,那就是vector< vector<int> >

+0

感谢您的回答。我刚刚澄清了我的问题,因为我认为我不能用矢量>来推荐。看看并告诉我,如果你有任何想法如何做到这一点!谢谢:) – thomas 2011-04-11 14:39:49

这听起来像你应该要么使包含自定义类或对

vector<pair<int, int> >

的矢量这将允许您无需属性越来越不匹配的可能性排序向量的向量。

+0

感谢您的回答。我刚刚澄清了我的问题,因为我认为我不能按照您的建议使用>。看看并告诉我,如果你有任何想法如何做到这一点!谢谢:) – thomas 2011-04-11 14:40:17

您可以设置mapintvector<int>,其中键是属性的值,值是包含具有该属性的所有元素的子向量。

+0

感谢您的回答。我刚刚澄清了我的问题,因为我认为我不能用int从地图到矢量 /实际上,我从来没有使用过地图,尽管我已经尝试过,但我从来没有得到我想要的东西。 :S看看我的说明并告诉我你是否有任何想法如何做到这一点!谢谢:) – thomas 2011-04-11 14:41:31

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

如果你想使所有元素的副本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()); 

你可以使用一个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