سلام؛ به چندین روش میتونید انجام بدید:
۱- سنتیترین روش، استفادهٔ مستقیم از حلقهها هست:
int main()
{
std::map<size_t, std::string> map;
init(map);
for (const auto &[key, value] : map)
{
if (value == "ghasem")
{
we_find_it(key, value);
}
}
}
۲- روش دیگه استفاده از تابع at هست، شما مثلاً یک کلید را دارید و به دنبال مقدارش در std::map میگردید. میتونید به اینصورت عمل کنید:
int main()
{
std::map<size_t, std::string> map;
init(map);
std::string value{};
try
{
value = map.at(1);
}
catch (...)
{
}
if (!value.empty())
{
we_find_it(5, value);
}
}
در اینجا درصورتیکه تابع at مقدار ۵ را پیدا نکند یک std::out_of_range پرتاب میکند.
۳- روش دیگر استفاده از STL Algorithm هست، که روش پیشنهاد شدهای هست. بهاینصورت که شما ابتدا و انتهای std::map خود را به std::find_if میدهید و یک تابع (یا شئ قابل فراخوانی) هم برای پیدا کردن مقدار مورد نظر هم ارسال میکنید و درصورتیکه شئ پیدا شود یک Iterator تابع std::find_if بر میگردوند در غیر اینصورت iterator انتهای شئ کلاس (end) را برمیگرداند :
int main()
{
std::map<size_t, std::string> map;
init(map);
const auto result =
std::find_if(map.begin(), map.end(), [](const auto i) {
return i.second == "ghasem" ? true : false;
});
if (result != map.end())
{
we_find_it(result->first, result->second);
}
}
یکی از مزیّتهای استفاده از STL Algorithm این هست که شما میتونید نوع اجرا شدن رو مشخص کنید، مثلاً من میتونم به اینصورت مشخص کنم که عملیات بهصورت Async اجرا شوند :
const auto result =
std::find_if(std::execution::par_unseq, map.begin(), map.end(), [](const auto i) {
return i.second == "ghasem" ? true : false;
});
نکته: برای اجرای کدهای بالا به این Header fileها نیاز دارید :
#include <execution>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
نکته: برای اجرای مثال اوّل، شما نیاز به یک کامپایلر سیپلاسپلاس با پشتیبانی از استاندارد ۱۷ دارید. درغیراینصورت حلقهٔ for رو به اینشکل بازنویسی کنید:
using map_str = std::map<size_t, std::string>;
for (map_str::iterator i = map.begin(); i != map.end(); ++i)
{
if (i->second == "ghasem")
{
we_find_it(i->first, i->second);
}
}
نکته: برای کامپایل Lambdaهایی که ورودی آنها از نوع auto هست نیاز به یک کامپایلر مطابق با استاندارد ۱۴ دارید، در غیر اینصورت یا باید صریحاً Type را مشخص کنید و یا مانند Lambdaها یک Template class درست کنید و Callabaleش کنید (با پیادهسازی عملگر () ) و استفاده کنید.