網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、說(shuō)明
Boost.Foreach
Boost.Foreach 提供了一個(gè)宏來(lái)模擬 C++11 中基于范圍的 for 循環(huán)。您可以使用在 boost/foreach.hpp 中定義的宏 BOOST_FOREACH 來(lái)迭代序列而不使用迭代器。如果你的開(kāi)發(fā)環(huán)境支持C++11,可以忽略Boost.Foreach。
二、示例代碼
2.1 最簡(jiǎn)單的代碼
#include <string>
#include <iostream>
#include <boost/foreach.hpp>
int main()
{
std::string hello("Hello, world!");
BOOST_FOREACH(char ch, hello)
{
std::cout << ch;
}
return 0;
}
運(yùn)算結(jié)果:
2.2 使用BOOST_FOREACH與BOOST_REVERSE_FOREACH
#include <boost/foreach.hpp>
#include <array>
#include <iostream>
int main()
{
std::array<int, 4> a{{0, 1, 2, 3}};
BOOST_FOREACH(int &i, a)
i *= i;
BOOST_REVERSE_FOREACH(int i, a)
{
std::cout << i << '\n';
}
}
運(yùn)算結(jié)果:
BOOST_FOREACH 需要兩個(gè)參數(shù)。第一個(gè)參數(shù)是一個(gè)變量或引用,第二個(gè)是一個(gè)序列。第一個(gè)參數(shù)的類(lèi)型需要與序列中元素的類(lèi)型相匹配。
任何提供迭代器的東西,比如標(biāo)準(zhǔn)庫(kù)中的容器,都被歸類(lèi)為一個(gè)序列。 Boost.Foreach 使用 Boost.Range 而不是直接訪(fǎng)問(wèn)成員函數(shù) begin() 和 end()。然而,因?yàn)?Boost.Range 是基于迭代器的,任何提供迭代器的東西都與 BOOST_FOREACH 兼容。
示例 52.1 使用 BOOST_FOREACH 迭代 std::array 類(lèi)型的數(shù)組。傳遞的第一個(gè)參數(shù)是一個(gè)引用,這樣您就可以讀取和修改數(shù)組中的元素。在示例 52.1 中,第一個(gè)循環(huán)將每個(gè)數(shù)字與自身相乘。
第二個(gè)循環(huán)使用宏 BOOST_REVERSE_FOREACH,它的工作原理與 BOOST_FOREACH 相同,但在一個(gè)序列上向后迭代。該循環(huán)按順序?qū)?shù)字 9、4、1 和 0 寫(xiě)入標(biāo)準(zhǔn)輸出流。
和往常一樣,如果塊只包含一個(gè)語(yǔ)句,則大括號(hào)可以省略。
請(qǐng)注意,您不應(yīng)使用使循環(huán)內(nèi)的迭代器無(wú)效的操作。例如,在向量上迭代時(shí)不應(yīng)添加或刪除元素。 BOOST_FOREACH 和 BOOST_REVERSE_FOREACH 要求迭代器在整個(gè)迭代過(guò)程中有效。
三、BOOST_FOREACH特點(diǎn)和應(yīng)用范圍
和傳統(tǒng)的for或者std::for_each()算法比起來(lái),BOOST_FOREACH顯得更加優(yōu)雅而簡(jiǎn)潔。
BOOST_FOREACH支持遍歷所有被Boost.Range識(shí)別為序列類(lèi)型的對(duì)象,通常包括如下幾種:
- STL容器
- 數(shù)組
- 字符串strings
如下是幾個(gè)常見(jiàn)的例子:
1. 用BOOST_FOREACH遍歷STL容器
2. 使用引用類(lèi)型獲取更高效的遍歷
std::list<int> list_int( /*...*/ );
BOOST_FOREACH( int i, list_int )
{
// do something with i
}
std::vector<std::vector<int> > matrix_int;
BOOST_FOREACH( std::vector<int> & row, matrix_int )
BOOST_FOREACH( int & i, row )
++i;
四、遍歷循環(huán)控制
使用break, continue,及return實(shí)現(xiàn)遍歷循環(huán)的控制
std::deque<int> deque_int( /*...*/ );
int i = 0;
BOOST_FOREACH( i, deque_int )
{
if( i == 0 ) return;
if( i == 1 ) continue;
if( i == 2 ) break;
}
此外,還一個(gè)小訣竅就是通過(guò)define將BOOST_FOREACH定義為更優(yōu)雅的方式:
#define foreach BOOST_FOREACH
BOOST_FOREACH并不復(fù)雜,有興趣的朋友可以看看,相信對(duì)提高大家的編程能力還是很有幫助的。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127996838
相關(guān)推薦
- 2022-10-09 淺談重繪和回流的解析_基礎(chǔ)教程
- 2022-05-21 k8s的包管理工具h(yuǎn)elm使用簡(jiǎn)介_(kāi)云其它
- 2022-07-28 Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法_python
- 2022-09-15 Python移動(dòng)測(cè)試開(kāi)發(fā)subprocess模塊項(xiàng)目實(shí)戰(zhàn)_python
- 2022-09-18 Python?Pandas實(shí)現(xiàn)DataFrame合并的圖文教程_python
- 2022-11-02 Python+eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式詳解_python
- 2022-08-10 C語(yǔ)言折半查找法的超詳細(xì)講解_C 語(yǔ)言
- 2022-08-25 python并發(fā)場(chǎng)景鎖的使用方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支