جستجوی مقادیر در std::map - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

جستجوی مقادیر در std::map

0 امتیاز
برای اینکه یک مقدار را در value‌ های std::map جستجو کنیم تابعی وجود داره؟
سوال شده تیر 15, 1399  بوسیله ی kabood (امتیاز 42)   1 6 8

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام؛ به چندین روش می‌تونید انجام بدید:

۱- سنتی‌ترین روش، استفادهٔ مستقیم از حلقه‌ها هست:

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ش کنید (با پیاده‌سازی عملگر () ) و استفاده کنید.

پاسخ داده شده تیر 15, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
انتخاب شد تیر 15, 1399 بوسیله ی kabood
...