0Pricing
C++ Academy · บทเรียน

เหตุผลที่ใช้ string_view

หลีกเลี่ยงการคัดลอกสตริง

เหตุผลที่ใช้ string_view เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

ต้นทุนของการคัดลอก

การส่ง std::string ด้วยค่าเป็นการคัดลอกบัฟเฟอร์ทั้งหมด สำหรับการเข้าถึงแบบอ่านอย่างเดียว การคัดลอกนั้นเป็นงานที่สูญเปล่า std::string_view คือมุมมองน้ำหนักเบาที่ไม่เป็นเจ้าของข้อมูล มีเพียงตัวชี้และความยาวเท่านั้น โปรด include <string_view>

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "hello";
    std::cout << sv << " len=" << sv.size() << "\n";
}

มุมมองเก็บอะไรไว้

string_view เก็บเพียงตัวชี้ไปยังอักขระที่มีอยู่แล้วและความยาวเท่านั้น มันไม่ได้เป็นเจ้าของหรือคัดลอกข้อมูล

#include <iostream>
#include <string>
#include <string_view>
int main() {
    std::string s = "world";
    std::string_view sv = s; // views s, no copy
    std::cout << sv << "\n";
}

พารามิเตอร์แบบอ่านอย่างเดียว

การรับ std::string_view ทำให้ฟังก์ชันของคุณทำงานกับ std::string, ลิเทอรัลสตริง และอาร์เรย์ char ได้โดยไม่ต้องคัดลอกสิ่งใด

#include <iostream>
#include <string_view>
void greet(std::string_view name) {
    std::cout << "Hi, " << name << "\n";
}
int main() {
    greet("Ada");
    greet(std::string("Bob"));
}

ไม่จัดสรรหน่วยความจำ

การสร้างมุมมองไม่เคยจัดสรรหน่วยความจำ จึงคัดลอกและส่งต่อด้วยค่าได้อย่างมีต้นทุนต่ำ

#include <iostream>
#include <string_view>
int main() {
    std::string_view a = "constant text";
    std::string_view b = a; // trivial copy
    std::cout << (a == b) << "\n";
}

ซับสตริงต้นทุนต่ำ

substr บนมุมมองจะส่งคืนมุมมองอีกอันที่ชี้ไปยังหน่วยความจำเดิม โดยไม่มีการคัดลอกอักขระ

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "abcdef";
    std::cout << sv.substr(2, 3) << "\n"; // cde
}

เปรียบเทียบเจตนาด้านประสิทธิภาพ

สำหรับฟังก์ชันที่ตรวจสอบข้อความเพียงอย่างเดียว string_view ช่วยหลีกเลี่ยงทั้งการจัดสรรหน่วยความจำบนฮีปและการคัดลอก ซึ่งมีความสำคัญในลูปที่ทำงานบ่อยและการแยกวิเคราะห์

ความยาวและการเข้าถึงด้วยดัชนี

มุมมองรองรับอินเทอร์เฟซที่คุ้นเคย ได้แก่ size(), empty(), การเข้าถึงด้วยดัชนี และการวนซ้ำตามช่วง

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "C++";
    for (char c : sv) std::cout << c << "-";
    std::cout << "\n" << sv.size() << "\n";
}

มุมมองเป็นแบบอ่านอย่างเดียว

คุณไม่สามารถแก้ไขอักขระผ่าน string_view ได้ มันให้สิทธิ์อ่านเท่านั้น หากต้องการแก้ไข คุณต้องใช้สตริงที่เป็นเจ้าของข้อมูล

จากลิเทอรัลสู่มุมมอง

ลิเทอรัลสตริงสามารถแปลงเป็นมุมมองได้โดยตรง ทำให้การส่งข้อความคงที่มีต้นทุนต่ำมาก

#include <iostream>
#include <string_view>
using namespace std::string_view_literals;
int main() {
    auto sv = "literal"sv;
    std::cout << sv.size() << "\n";
}

ไม่ใช่สิ่งทดแทนสตริง

ใช้ std::string เมื่อต้องเป็นเจ้าของ จัดเก็บ หรือแก้ไขข้อความ ใช้ std::string_view สำหรับพารามิเตอร์ชั่วคราวแบบอ่านอย่างเดียว

ข้อควรระวังเรื่องอายุการใช้งาน

เนื่องจากมุมมองไม่ได้เป็นเจ้าของข้อมูล อักขระต้นทางจึงต้องมีอายุการใช้งานยาวนานกว่ามุมมอง การใช้ผิดวิธีจะทำให้เกิดมุมมองลอยค้าง ซึ่งจะกล่าวถึงในบทเรียนถัดไป

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับเหตุผลที่มี string_view

สรุป

คุณได้เรียนรู้เหตุผลที่มี string_view:

  • เป็นมุมมองแบบตัวชี้และความยาวที่ไม่เป็นเจ้าของข้อมูล
  • การรับมุมมองนี้ช่วยหลีกเลี่ยงการคัดลอกและการจัดสรรหน่วยความจำสำหรับข้อความแบบอ่านอย่างเดียว
  • ทำงานกับสตริง ลิเทอรัล และอาร์เรย์ char ได้
  • ข้อมูลที่มุมมองอ้างถึงต้องมีอายุการใช้งานยาวนานกว่ามุมมอง

คำถามที่พบบ่อย

บทเรียน “เหตุผลที่ใช้ string_view” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เหตุผลที่ใช้ string_view” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เหตุผลที่ใช้ string_view”

หลีกเลี่ยงการคัดลอกสตริง คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “เหตุผลที่ใช้ string_view” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุผลที่ใช้ string_view
  2. การสร้างวิว
  3. ข้อควรระวังและอายุการใช้งาน
  4. อัลกอริทึมสตริง
← กลับไปที่ C++ Academy