ã¢ãã³ç¬¬6ç« ïŒãC++17ããŒãã³ããŒæååé©åœïŒstd::string_view
æååã颿°ã«æž¡ããã³ã«çºçããããŒãã¢ãã±ãŒã·ã§ã³ïŒmalloc/newïŒã®æ²æ»
æååã颿°ã«æž¡ãéãã¬ã¬ã·ãŒC++ã§ã¯ const std::string& ã䜿ãã®ãåžžèãšãããŠããŸãããããããæååãªãã©ã«ïŒ"laser.png"ïŒã Cèšèªåœ¢åŒã® const char* ãæž¡ããã³ã«ãstd::string ã®äžæãªããžã§ã¯ããçæãããè£ã§æé»ã®ããŒãã¡ã¢ãªç¢ºä¿ïŒmalloc/newïŒãèµ°ããšããèŽåœçãªèœãšã穎ãååšããŸããäœäžåãã®ã¢ã»ããåç
§åãããã¹ãæç»ã§ãããèµ·ãããšãæ¿ããããŒãæçåãšãã¬ãŒã èœã¡ïŒGCã¹ãã€ã¯ã«äŒŒã忢ïŒã®åå ã«ãªããŸããC++17ã§å°å
¥ããã std::string_view ã¯ãæååã®ããã€ã³ã¿ãšé·ããã ããä¿æããããã16ãã€ãã®è¶
軜éãã¥ãŒã§ããæååã®ã³ããŒãã¢ãã±ãŒã·ã§ã³ãå®å
šãŒãïŒO(1)ïŒã«ããéšåæååã®åãåºãïŒsubstrïŒãäžç¬ã§å®äºããŸããæ¬ç« ã§ã¯ããã®é©ç°çãªã¡ã¢ãªæ§é ãããçŸå ŽãããæãèŠæãã¹ãããã³ã°ãªã³ã°åç
§ãããnullçµç«¯æåïŒ\0ïŒã®äžåšããšããèœãšã穎ãŸã§ã培åºè§£åããŸãã
M6.1 ãªã const std::string& ã§ã¯äžååãªã®ãïŒïŒæé»ã¢ãã±ãŒã·ã§ã³ã®çœ ïŒ
çŸä»£C++ã«ãã㊠const std::string& ãæ±ããé ããã³ã¹ããšãæååãªãã©ã«åãæž¡ãæã®çœ ãè§£åããŸãã
ð§ ãã³ã®ã³å
茩
ã·ãã¯ãå
çïŒã广é³ãåçãã颿° playSound(const std::string& name)ããäœã£ãŠã匟ãæã€ãã³ã« playSound("laser_shoot") ãšåŒãã§ãããããããã¡ã€ã©ã§æ¯ãã¬ãŒã malloc ãé£çºããŠèŠåãåºãŸããïŒåç
§æž¡ãïŒ&ïŒã ããã³ããŒã¯èµ·ããŠããªãã¯ããªã®ã«äœæ
ã§ããïŒïŒ
ð»ââïž ã·ãã¯ãå
ç
ãµãã£ãµãã£ãµãïŒãããããå
šC++ããã°ã©ããäžåºŠã¯ããããæé»ã®äžæãªããžã§ã¯ãçæãã®çœ ããïŒ"laser_shoot" 㯠const char[12]ïŒæååãªãã©ã«ïŒãããªãäžæ¹ã颿°ã®åŒæ°ã¯ std::string ãžã®åç
§ãããåãéããããïŒ
ð§ ãã³ã®ã³å
茩
ããã£ïŒconst char* ãã std::string ã«å€æããããã«ãèŠããªããšããã§äžæç㪠std::string ã new ãããŠããŒãã¡ã¢ãªã確ä¿ãããŠãããã§ããïŒïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãïŒé¢æ°ãæããã°ãã®äžææååã¯å³åº§ã« delete ããããæ¯ç§60ãã¬ãŒã ã匟ãåºããã³ã« new ãš delete ãç¹°ãè¿ãã°ããŒãã¯ãºã¿ãºã¿ããããã®åé¡ãæ ¹æ¬è§£æ±ºããããã« C++17 ã§çã¿åºãããã®ããstd::string_viewããªã®ããïŒ
M6.2 std::string_view ã®ã¡ã¢ãªæ§é ïŒãã€ã³ã¿ïŒé·ãã®è¶
軜éã¹ã©ã€ã¹
std::string_view ã®å
éšæ§é ãšãsubstr() ããªã O(1) ãŒãã³ã¹ãã§å®è¡ã§ããã®ããèŠèŠçã«çŽè§£ããŸãã
ð§ ãã³ã®ã³å
茩
string_view ã®äžèº«ã£ãŠãå
·äœçã«ã©ããªã£ãŠãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
極ããŠã·ã³ãã«ãããïŒäžèº«ã¯ãconst char* ptr_ããšãsize_t length_ãã®2ã€ã®ã¡ã³ã倿°ãããªãã64bit CPUãªã 8ãã€ã ïŒ 8ãã€ã ïŒ ãã£ãã® 16ãã€ã ããïŒ
ð§ ãã³ã®ã³å
茩
ãã£ïŒãã£ãããã ãã§ããïŒïŒãããæååã®äžéšãåãåºã substr() ãåŒãã ãäœãèµ·ãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
std::string ã® substr() ãªãæ°ããæååã¡ã¢ãªã確ä¿ããŠæåãå
šéšã³ããŒããããstd::string_view ã® substr() ã¯ãå
é ãã€ã³ã¿ã«ãªãã»ãããè¶³ããé·ããæžãããã ãããïŒ1ããç§ããããã¬ïŒ
M6.3 ãæéèŠã»çŸå Žã®èœãšã穎ããã³ã°ãªã³ã°åç
§ãš nullçµç«¯ã®äžåš
ããã§ãèŠèœãšããã¡ãª string_view ã®2倧ãã©ããïŒã寿åœåãïŒæªå®çŸ©åäœïŒããšã\0 ãªãåé¡ããå®å
šã«åé¿ããèšèšæéã
ð§ ãã³ã®ã³å
茩
ã·ãã¯ãå
çïŒé¢æ°ã®æ»ãå€ã§ std::string_view ãè¿ããããåãåã£ãå
ã§æååãæååãããŠã²ãŒã ãã¯ã©ãã·ã¥ããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
åãŒãŒãŒãïŒãã㯠string_view åå¿è
ã100人äž100人èžãããã³ã°ãªã³ã°ã»ãã€ã³ã¿ã®çœ ãããïŒé¢æ°å
ã®ããŒã«ã« std::string ã string_view ã§è¿ããŠã¯ããããããããªïŒïŒ
ð§ ãã³ã®ã³å
茩
ã®ã¯ãïŒãstd::string temp = "score_" + to_string(s); return temp;ããšããŠããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
temp ã¯é¢æ°ãæããç¬éã«ãã¹ãã©ã¯ã¿ã§ã¡ã¢ãªãæ¶æ»
ããïŒè¿ããã string_view ã¯ããã§ã«æ»ãã ã¡ã¢ãªã®å¢å ŽããæããŠããã®ããïŒstring_view ã¯ãæææš©ãæããªããã寿åœç®¡çã®éåãä»ããé ã«å»ã¿èŸŒãã®ããïŒ
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
- èœãšã穎1ïŒäžæãªããžã§ã¯ãã®å¯¿åœåãïŒãã³ã°ãªã³ã°åç
§ïŒ: 颿°ã®æ»ãå€ã§ string_view ãè¿ããŠããã®ã¯ãéçæååãªãã©ã«ããåŒã³åºãå
ããé·çãããã¡ã³ã倿°ã®åç
§æã®ã¿ãäžææååïŒstd::stringïŒã®æ»ãå€ã¯å€ã§è¿ãããšã
- èœãšã穎2ïŒnullçµç«¯æåïŒ\0ïŒã§çµãã£ãŠããä¿èšŒããªã: substr() ãã string_view ã®æ«å°Ÿã«ã¯ \0 ããããŸãããfopen(sv.data()) ã printf("%s", sv.data()) ãªã© CèšèªAPIã«çŽæ¥ .data() ãæž¡ããšãããã¡ãªãŒããŒã©ã³ã§ã¯ã©ãã·ã¥ããŸãã
M6.4 宿ŠïŒã²ãŒã å
ã¢ã»ãããã¡ã€ã³ããŒãšè¶
é«éããã¹ãã¬ã³ãã©ãŒ
ã²ãŒã ã«ãŒãå
ã§äœååãåŒã°ããã¢ã»ããæ€çŽ¢ãšãã°ããŒãµãŒã std::string_view ã§æé©åããŸãã
ð§ ãã³ã®ã³å
茩
å
çïŒã²ãŒã ã«ãŒãã®æ¯ãã¬ãŒã ãæµã®çš®å¥åãããã¯ã¹ãã£IDãåŒããããæ€çŽ¢ã string_view ã«ããŠã¿ãŸãïŒ
ð»ââïž ã·ãã¯ãå
ç
ããïŒstd::string_view ãããŒãšããŠæ€çŽ¢ã§ããããã«ãããšãäžææååã®çæããŒãã«ãªããGCã¬ã¹ãªæ¥µéã®ãã¬ãŒã ã¬ãŒãå®å®åãå®çŸãããïŒ
ð AssetLookup.cpp
#include <iostream>
#include <string_view>
#include <array>
struct AssetMetadata {
std::string_view key;
int textureId;
};
// ã³ã³ãã€ã«æ constexpr é
åã§ã¢ã»ããããŒãã«ãå®çŸ©
constexpr std::array<AssetMetadata, 3> ASSET_TABLE = {{
{"enemy_crab", 101},
{"enemy_squid", 102},
{"enemy_octopus", 103}
}};
// std::string_view åŒæ°ã«ãããconst char* ã§ã std::string ã§ããŒãã³ããŒã§æ€çŽ¢å¯èœ
int findTextureId(std::string_view assetKey) {
for (const auto& item : ASSET_TABLE) {
if (item.key == assetKey) {
return item.textureId;
}
}
return -1; // Not Found
}
// æ¡åŒµåãã§ãã¯é¢æ°ïŒO(1) ãŒãã¢ãã±ãŒã·ã§ã³ïŒ
bool isPngAsset(std::string_view filepath) {
if (filepath.length() < 4) return false;
return filepath.substr(filepath.length() - 4) == ".png";
}
int main() {
std::cout << "--- M6 ã¢ã»ããç
§åã·ã¹ãã ---" << std::endl;
// æååãªãã©ã«ã§æ€çŽ¢ïŒã¢ãã±ãŒã·ã§ã³ 0ïŒ
int id1 = findTextureId("enemy_squid");
std::cout << "enemy_squid Texture ID: " << id1 << std::endl;
// åç std::string ã§æ€çŽ¢ïŒã¢ãã±ãŒã·ã§ã³ 0ïŒ
std::string dynamicKey = "enemy_crab";
int id2 = findTextureId(dynamicKey);
std::cout << "enemy_crab Texture ID: " << id2 << std::endl;
// æ¡åŒµåå€å®
std::cout << "laser.png is valid? " << std::boolalpha << isPngAsset("laser.png") << std::endl;
std::cout << "laser.wav is valid? " << std::boolalpha << isPngAsset("laser.wav") << std::endl;
return 0;
}
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. std::string_view ãå
éšã§ä¿æããŠããããŒã¿æ§é ïŒã¡ã³ãïŒãšããŠæ£ãããã®ã¯ã©ãã§ããïŒ
- 1. ç¬èªã«ããŒã確ä¿ããæååãããã¡ãžã®ææãã€ã³ã¿ãšãã£ãã·ãã£
- 2. æååããŒã¿ã®å
é ãæããã€ã³ã¿ïŒconst char*ïŒãšããã®é·ãïŒsize_tïŒã®2ã€ã®ã¿
- 3. std::string ãžã®åç
§ã«ãŠã³ã¿ãšãã¥ãŒããã¯ã¹
- 4. nullçµç«¯æååã®ã³ããŒé
åïŒ256ãã€ãåºå®ãããã¡ïŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæååããŒã¿ã®å
é ãæããã€ã³ã¿ïŒconst char*ïŒãšããã®é·ãïŒsize_tïŒã®2ã€ã®ã¿
std::string_view ã¯æååã®æææš©ãæãããæ¢åã®æååã®ãå
é ãã€ã³ã¿ããšãæåæ°ãã®2ã€ïŒåèš16ãã€ã/64bitç°å¢ïŒã ããä¿æããè¶
軜éãã¥ãŒã§ãããã®ããã³ããŒã³ã¹ãã¯ã»ãŒãŒãã§ãã
Q2. 颿°ã®èªã¿åãå°çšåŒæ°ã« const std::string& ã§ã¯ãªã std::string_view ã倿ž¡ãããæå€§ã®ã¡ãªããã¯äœã§ããïŒ
- 1. 颿°ã®ã³ã³ãã€ã«æéã10åé«éã«ãªã
- 2. æååãªãã©ã«ïŒ"enemy.png"ïŒã const char* ãæž¡ããéã«ãstd::string ã®æé»ã®äžæãªããžã§ã¯ãçæïŒããŒã確ä¿ïŒãäžåçºçããªããªã
- 3. 颿°å
ã§æž¡ãããæååãèªç±ã«æžãæããããããã«ãªã
- 4. ãã¹ãŠã®æååãèªåçã«æå·åããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæååãªãã©ã«ïŒ"enemy.png"ïŒã const char* ãæž¡ããéã«ãstd::string ã®æé»ã®äžæãªããžã§ã¯ãçæïŒããŒã確ä¿ïŒãäžåçºçããªããªã
const std::string& ã«æååãªãã©ã«ãæž¡ããšãæé»ã« std::string ã®äžæãªããžã§ã¯ããäœæããããŒã確ä¿ïŒmallocïŒãèµ°ã£ãŠããŸããŸããstd::string_view ã§ããã°ãã€ã³ã¿ãšé·ããã¬ãžã¹ã¿ã§çŽæ¥åãåããããäžåã®ã¡ã¢ãªç¢ºä¿ãèµ·ããŸããã
Q3. std::string_view ã宿Šã§å©çšããéãæãèŠæãã¹ãé倧ãªèœãšã穎ã¯ã©ãã§ããïŒ
- 1. æ¥æ¬èªïŒUTF-8ïŒã®æååãæž¡ããšå¿
ãæ§æãšã©ãŒã«ãªã
- 2. std::string_view ã¯æææš©ãæããªããããåç
§å
ã®äžæãªããžã§ã¯ãç Žæ£åŸã«ã¢ã¯ã»ã¹ãããšãã³ã°ãªã³ã°åç
§ïŒæªå®çŸ©åäœïŒã«ãªããæ«å°Ÿã« nullçµç«¯æåïŒ\0ïŒãããä¿èšŒããªã
- 3. é·ãã10æå以äžã®æååãåãåãããšãã§ããªã
- 4. ãã«ãã¹ã¬ããç°å¢ã§äœ¿çšãããšå¿
ããããããã¯ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒstd::string_view ã¯æææš©ãæããªããããåç
§å
ã®äžæãªããžã§ã¯ãç Žæ£åŸã«ã¢ã¯ã»ã¹ãããšãã³ã°ãªã³ã°åç
§ïŒæªå®çŸ©åäœïŒã«ãªããæ«å°Ÿã« nullçµç«¯æåïŒ\0ïŒãããä¿èšŒããªã
std::string_view ã¯åç
§å
ã¡ã¢ãªãææããŠããªããããäžæãªããžã§ã¯ãã®å¯¿åœãåãããšãã³ã°ãªã³ã°åç
§ïŒæªå®çŸ©åäœïŒã«ãªããŸãããŸããéšåæååïŒsubstrïŒã®åãåºãçã§ã¯æ«å°Ÿã« \0 ããªããããprintf çã® CèšèªAPIã« .data() ãçŽæ¥æž¡ãã®ã¯å±éºã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â