python中,对一个list,按照某种标准可以筛选出部分元素组成一个新list,对新list里元素的所有操作都会体现在原list里。那么在c++中,也想实现此功能。
定义结构体AAA用于描述数据,该数据位于第sliceN层,该数据的值是value
现在,构造一个函数 getCandicates 用以从 vector
函数 getCandicates的筛选标准是,对于一个给定的层编号 numNow 以及 给定的增加范围 MaxAddSliceNum,筛选出层编号介于 numNow 和 numNow+MaxAddSliceNum 之间的数据。
struct AAA {
int sliceN; // 层编号
float value; // 数据值
};
bool getCandicates(const size_t& numNow, vector& stentlist, const int& MaxAddSliceNum, vector& partStentlist)
{
try
{
int sliceN_now = stentlist[numNow].sliceN;
for (size_t num = (numNow + 1); num < stentlist.size(); num++)
{
if (stentlist[num].sliceN > (sliceN_now + MaxAddSliceNum)) // 当遍历到某数据的层编号大于范围时 不再继续遍历
{
return true;
}
partStentlist.push_back(&stentlist[num]);
}
return true;
}
catch (...)
{
return false;
}
}
int main() {
std::vector exampleVec = { {1, 2.0}, {2, 3.0}, {2, 4.0}, {3, 5.0}, {3, 6.0}, {4, 7.0}, {4, 8.0}, {5, 9.0}, {5, 10.0} };
vector partStentPtrlist;
getCandicates(3, exampleVec, 1, partStentPtrlist);
for (AAA* elementPtr : partStentPtrlist)
{
//cout << elementPtr->sliceN << endl;
//cout << elementPtr->value << endl;
(*elementPtr).value = 999;
}
for (AAA a : exampleVec)
{
cout << a.sliceN << endl;
cout << a.value << endl;
cout << "----" << endl;
}
return 0;
}
1
2
----
2
3
----
2
4
----
3
5
----
3
999
----
4
999
----
4
999
----
5
9
----
5
10
----
for (AAA* elementPtr : partStentPtrlist)
{ ... }
这种遍历方法类似于下面
for (size_t t=0; t
不同的在于 elementPtr 是一个指针 因此 (*elementPtr).value = 999; 可以直接对该指针指向的元素进行修改。
但是,对于一个非指针构成的vector,需要加入“&”符号,以实现对vector里的元素进行更改,比如下面两段代码是等价的:
std::vector exampleVec = { {1, 2.0}, {2, 3.0}, {2, 4.0}, {3, 5.0}, {3, 6.0}, {4, 7.0}, {4, 8.0}, {5, 9.0}, {5, 10.0} };
for (size_t t = 0; t < exampleVec.size(); t++)
{
exampleVec[t].value = 999;
}
std::vector exampleVec = { {1, 2.0}, {2, 3.0}, {2, 4.0}, {3, 5.0}, {3, 6.0}, {4, 7.0}, {4, 8.0}, {5, 9.0}, {5, 10.0} };
for (AAA& aaa: exampleVec)
{
aaa.value = 999;
}
请务必注意,第二段代码里的 & 万万不可缺少