我想用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}
所以我想我不能做一些载体矢量,因为有些人在推荐,任何想法?
再次感谢!!!
答案 0 :(得分: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;
}
答案 1 :(得分:2)
您可以使用std::map<int, std::vector<int>>
跟踪每个媒体资源以及与该媒体资源相关联的数字。 E.g:
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的数字
答案 2 :(得分:0)
你可以使用int的vector向量,即vector< vector< int > >
。
答案 3 :(得分:0)
听起来你应该制作一个包含自定义类的矢量或一对矢量
vector<pair<int, int> >
这将允许您对矢量进行排序,而不会出现属性不匹配的情况。
答案 4 :(得分:0)
您可以设置map
从int
到vector<int>
,其中键是属性的值,值是包含具有该属性的所有元素的子向量。
答案 5 :(得分: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() );