关于C++11的 for each语句的补充说明

自定义结构体:

struct edge{
	int u,v,w;
	bool used;
	edge(int u,int v,int w):u(u),v(v),w(w),used(false){}
}; 

下面有三种不同的遍历方式:

1、常量引用遍历 

for(const edge& e:est){
	cout<<e.u<<' '<<e.v<<' '<<e.w<<' '<<e.used<<endl;
}
  • 这是只读操作(如打印、计算值)

  • 直接访问内存,不会发生拷贝结构体较大时优先使用(避免拷贝开销)

  • 推荐作为默认选择(安全且高效),现代C++推荐写法        

2、非常量引用遍历

for(edge& e:est){
	cout<<e.u<<' '<<e.v<<' '<<e.w<<' '<<e.used<<endl;
    e.used=true;  //可对est容器的数据进行修改
}
  • 需要修改容器元素(如更新标志位、重置状态)

  • 需要避免拷贝的大结构体操作

3、值传递遍历

for(edge e:est){
	cout<<e.u<<' '<<e.v<<' '<<e.w<<' '<<e.used<<endl;
    e.used = true; // 只修改副本,不影响原容器
}
  • 需要独立修改临时副本且不影响原数据

  • 结构体非常小(如小于16字节)时可用

  • 不推荐用于大结构体或频繁遍历场景

4、使用建议:

1、首选 const auto&
for (const auto& e : est) { ... }  // 现代C++推荐写法
2、需修改元素时用 auto&
for (auto& e : est) { 
    e.used = true; // 直接修改容器内元素
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值