C++中std::for_each的使用
std::for_each的使用
std::for_each 是 C++ 標(biāo)準(zhǔn)庫中的一個(gè)算法,用于遍歷容器并對每個(gè)元素執(zhí)行指定的操作。適用于 std::vector、std::list、std::array 等標(biāo)準(zhǔn)容器。
1. 語法
#include <algorithm> template<class InputIt, class UnaryFunction> UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);
first:起始迭代器(包含)。last:結(jié)束迭代器(不包含)。f:對元素執(zhí)行的函數(shù)對象,接受單個(gè)參數(shù)。
返回值:
返回 f,即傳入的函數(shù)對象(可用于累積狀態(tài))。
2. 基本用法
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用 std::for_each 遍歷并打印元素
std::for_each(vec.begin(), vec.end(), [](int x) {
std::cout << x << " ";
});
return 0;
}
輸出
1 2 3 4 5
3. 使用普通函數(shù)
#include <iostream>
#include <vector>
#include <algorithm>
// 普通函數(shù)
void printElement(int x) {
std::cout << x << " ";
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), printElement);
return 0;
}
4. 使用 std::for_each 計(jì)算累積和
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
int sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int x) {
sum += x;
});
std::cout << "Sum: " << sum << std::endl;
return 0;
}
輸出
Sum: 15
這里使用了 Lambda 捕獲 [&sum] 來累加元素值。
5. 使用 std::for_each 修改元素
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用 std::for_each 修改元素
std::for_each(vec.begin(), vec.end(), [](int &x) {
x *= 2;
});
// 輸出修改后的值
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
輸出
2 4 6 8 10
注意:需要傳遞 int &x 才能修改原數(shù)據(jù)。
6. 與 range-based for 循環(huán)對比
使用 for_each 適用于需要函數(shù)對象(如 Lambda 或 functor),但 C++11 之后的 范圍 for 循環(huán) 更簡潔:
for (int &x : vec) {
x *= 2;
}
相比 std::for_each,范圍 for 在可讀性上更好。
7. for_each 與函數(shù)對象
可以使用自定義仿函數(shù):
#include <iostream>
#include <vector>
#include <algorithm>
struct Multiply {
void operator()(int &x) const {
x *= 3;
}
};
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), Multiply());
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
輸出
3 6 9 12 15
仿函數(shù) 適用于復(fù)雜操作或需要在多個(gè)地方復(fù)用時(shí)。
8. 總結(jié)
| 方法 | 可讀性 | 適用場景 |
|---|---|---|
| std::for_each | 適中 | 需要 Lambda、仿函數(shù)或函數(shù)指針 |
| range-based for | 高 | 適用于大多數(shù)遍歷任務(wù) |
| 普通 for 循環(huán) | 低 | 需要索引訪問元素 |
當(dāng)代碼需要傳遞回調(diào)(如 std::transform 或 std::accumulate 結(jié)合使用)時(shí),std::for_each 更合適,否則推薦 范圍 for 語法。
到此這篇關(guān)于C++中std::for_each的使用的文章就介紹到這了,更多相關(guān)C++ std::for_each內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)頁面置換 先進(jìn)先出算法(FIFO)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)頁面置換,先進(jìn)先出算法(FIFO),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
C++ OpenCV實(shí)現(xiàn)銀行卡號(hào)識(shí)別功能
這篇文章主要介紹了如何使用OpenCV C++實(shí)現(xiàn)銀行卡號(hào)識(shí)別功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-01-01
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹;可供參考2012-11-11

