رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران
کامبیز اسدزاده

تفاوت بین std::string_view و std::span


امتیاز دادن به این موضوع:

پست های پیشنهاد شده

با توجه به عنوان مقاله، شباهت‌های بسیاری بین std::string_view و std::span وجود دارد، در واقع، string_view و span اشیاء‌ای هستند که به یک ترتیبِ به هم پیوسته از عناصری اشاره دارند که نقطهٔ آغازین آن‌ها از موقعیت صفر است؛ و همچنین عملیات استاندارد نگه‌دارنده‌ها (ظرف) را ارائه می‌کنند. هر دو نوع شیء از نوع easy-to-copy (کپی آسان) هستند که دارای یک اشاره‌گر و یک عنصر اندازه هستند. از نظر مفهومی، آن‌ها دیدگاه‌های غیر صاحب یک آرایه (یا دنبالهٔ پیوسته) هستند که رابط استاندارد غنی‌ای را ارائه می‌کنند.

در مورد تفاوت‌ها (اختلافات) بین این دو، <std::span<T یک الگوی نمایش آرایه‌ای با هدف کلی است، در حالی که std::string_view یک نمایش تخصصی‌تر در یک دنباله‌کاراکتر یا رشته است. در زیر شرح مختصری از این تفاوت‌ها آورده شده است:

  1. شیء span یک قالب (Template) است، اما string_view خیر!
    • شیء span، الگویی است که با هر نوعِ تعریف شده توسط کاربر کار می‌کند، در حالی که string_view به طور خاص نمای یک آرایهٔ مشخص پیوسته است. از نظر سطحی یک string_view معادل <span <char  است.
      char buff[] = "Hello World";
      
      auto sp = std::span<char>(&buff[0], 5);
      auto sv = std::string_view(&buff[6], 5);
      
      for(auto c : sp) 
        std::cout << c; //Hello
      
      std::cout << " ";
      
      for(auto c : sv) 
        std::cout << c; //World

      اما، ویژگی‌های string_view بیشتر از این مورد می‌تواند باشد.

  2. شیء string_view یک نوع فقط خواندنی برای نمایش است.
  3. یکی از ویژگی‌های برجستهٔ string_view این است که این شیء فقط یک نمایش فقط خواندنی است. بنابراین، ما نمی‌توانیم یک آرایهٔ زیرین را از طریق یک string_view تغییر دهیم، در حالی که این امکان از طریق span ممکن است:
    char str[] = "hello";
    
    //Change str to uppercase through span
    auto sp = std::span<char>(str,strlen(str));
    std::transform(sp.begin(), sp.end(), sp.begin(),
                   [](char c) { return std::toupper(c); });
    
    //str is now HELLO
    
    //Back to lowercase via string_view is not possible.
    auto sv = std::string_view(str);
    std::transform(sv.begin(), sv.end(), sv.begin(),
                   [](char c) { return std::tolower(c); }); //ERROR!

    اگر string_view فقط خواندنی باشد، طول آن به اندازهٔ کافی انعطاف‌پذیر است که از طریق <span <const T به یک نمایش فقط خواندنی تبدیل می‌شود. بنابراین یک string_view به یک <span <const char نزدیک‌تر است. البته یک ویژگی وجود دارد که string_view را تضمین می‌کند.

  4. شیء string_view از عملیات std::string-like پشتیبانی می‌کند.
  5. شیء span دارای چندین عملیات متوالی پیوسته است، به عنوان مثال: front, back, begin و operator[]. با این حال، string_view چندین روش دیگر مانند std::string دارد، به عنوان مثال: substr, find, compare سربارگذاری اپراتور‌ها (مانند == و < یا >). بنابراین، string_view می‌تواند نیازِ به std::string را در مواردی که فضای زیرین آن مهم نیست را از بین ببرد.
  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...