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

应用场景:

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

例子:

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

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

函数 getCandicates的筛选标准是,对于一个给定的层编号 numNow 以及 给定的增加范围 MaxAddSliceNum,筛选出层编号介于 numNow 和 numNow+MaxAddSliceNum 之间的数据。

struct AAA {
	int sliceN;  // 层编号
	float value;  // 数据值
};


bool getCandicates(const size_t& numNow, vector<AAA>& stentlist, const int& MaxAddSliceNum, vector<AAA*>& 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<AAA> 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<AAA*> 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<partStentPtrlist; t++)
{  
    // partStentPtrlist[t];   
}

不同的在于 elementPtr 是一个指针 因此 (*elementPtr).value = 999; 可以直接对该指针指向的元素进行修改。

但是,对于一个非指针构成的vector,需要加入“&”符号,以实现对vector里的元素进行更改,比如下面两段代码是等价的:

std::vector<AAA> 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<AAA> 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;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值