C++ 零碎知识 基础知识 vector中选取部分元素(地址不变)

应用场景:

python中,对一个list,按照某种标准可以筛选出部分元素组成一个新list,对新list里元素的所有操作都会体现在原list里。那么在c++中,也想实现此功能。

例子:

定义结构体AAA用于描述数据,该数据位于第sliceN层,该数据的值是value

现在,构造一个函数 getCandicates 用以从 vector stentlist 中筛选出部分的 AAA,提取他们的地址,组成一个新的vector,记为vector partStentlist。这样一来,对 partStentlist 中涉及元素的操作都会作用回 stentlist。

函数 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;
}

请务必注意,第二段代码里的 & 万万不可缺少

你可能感兴趣的:(基础,c++,c++)