繁体   English   中英

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

[英]Dividing a vector into smaller vectors upon its properties

我想用C ++写一些东西,虽然我有这个想法,但我试图写它,但我没有达到如何做到这一点。

说明

想象一下,我有一个vector<int> ,我们定义运行程序的eveytime。 它的名字是mainVector这个向量将有一个随机数的整数。 每个int都有一个属性。

例如,我们有一个带有以下值的vector<int> mainVector {1, 3, 15, 33, 35, 42, 57, 69, 73}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,1,2,2,3,3,3 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} bigVector <int> {1, 2, 3, 4, 5, 6, ...., 99, 100, 101, ..., n}vector <int> properties是一个向量,实际上是一个大的bigvector在任何情况下都可以是不同的,例如,在一次执行中我可以是{1, 1, 1, 1, 1, 1, ..., 1, 1, 2, ... 2} 1,1,1,1,1,1,...,1,1,2 {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;
}

您可以使用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;
}

打印(对于您给出的示例数据):

所有数字的属性值为1:1 3 15
所有数字的属性值为2:33 35 42
所有数字的属性值为3:57 69 73

你可以使用int的vector向量,即vector< vector< int > >

听起来你应该制作一个包含自定义类或矢量对的矢量

vector<pair<int, int> >

这将允许您对矢量进行排序,而不会出现属性不匹配的可能性。

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

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

如果要将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() );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM