Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

将 C++ 中结构体的属性作为数组元素访问?

Posted on 2024-12-16

在 C++ 中,使用由多个字符串组成的类或结构来表示 URL 可能是合理的,如下所示:

结构基本{ 
  
std ::字符串协议; 
  
std ::字符串用户名; 
  
std ::字符串密码; 
  
std ::字符串主机名; 
  
std ::字符串端口; 
  
std ::字符串路径名; 
  
std ::字符串搜索; 
  
std ::字符串哈希; 
  
} ;

您可以为每个组件(协议、用户名等)关联一个索引,如下所示:

枚举类组件{ 
  
 协议= 0 , 
  
 用户名= 1 , 
  
 密码= 2 , 
  
 主机名= 3 , 
  
 端口= 4 , 
  
 路径名= 5 , 
  
 搜索= 6 , 
  
 哈希= 7 , 
  
} ;

然后您可能想要做的是通过索引访问组件。下面的代码可能会这样做:

 std::string& get_component(basic& url, 组件 comp) { 
  
开关(补偿) { 
  
case组件::协议:返回url 。协议; 
  
case组件:: USERNAME :返回url 。用户名; 
  
case组件:: PASSWORD :返回url 。密码; 
  
case组件:: HOSTNAME :返回url 。主机名; 
  
case组件:: PORT :返回url 。港口; 
  
case组件:: PATHNAME :返回url 。路径名; 
  
case组件:: SEARCH :返回url 。搜索; 
  
case组件:: HASH :返回url 。哈希; 
  
} 
  
}

但是,如果您不断通过索引访问值怎么办?您可能担心 switch/case 的开销可能太大。

相反,您可以翻转数据结构并将值存储在数据结构内的数组中。以下方法可能有效:

结构脂肪{ 
  
std :: array < std :: string , 7 >数据; 
  
std ::字符串&协议=数据[ 0 ] ; 
  
std ::字符串&用户名=数据[ 1 ] ; 
  
std ::字符串&密码=数据[ 2 ] ; 
  
std ::字符串&主机名=数据[ 3 ] ; 
  
std ::字符串&端口=数据[ 4 ] ; 
  
std ::字符串&路径名=数据[ 5 ] ; 
  
std ::字符串&搜索=数据[ 6 ] ; 
  
std ::字符串&哈希=数据[ 7 ] ; 
  
} ;

有了这个新的数据结构,通过索引获取组件变得更简单:

 std :: string & get_component ( fat & url ,组件 comp ) { 
  
返回网址。数据[ int ( comp ) ] ; 
  
} ;

不幸的是,新的 fat 数据结构中的每个引用可能使用 8 个字节。如果您希望只有很少的数据结构实例,那么这不是问题。但是,如果您这样做,您可能希望避免引用。您可以尝试通过简单的方法替换引用:

结构高级{ 
  
std :: array < std :: string , 7 >数据; 
  
std :: string & protocol ( ) {返回数据[ 0 ] ; } 
  
std :: string & username ( ) {返回数据[ 1 ] ; } 
  
std ::字符串和密码( ) {返回数据[ 2 ] ; } 
  
std :: string &主机名( ) {返回数据[ 3 ] ; } 
  
std :: string & port ( ) {返回数据[ 4 ] ; } 
  
std :: string &路径名( ) {返回数据[ 5 ] ; } 
  
std :: string & search ( ) {返回数据[ 6 ] ; } 
  
std :: string & hash ( ) {返回数据[ 7 ] ; } 
  
} ;

它并不完全令人满意,因为它需要调用方法而不是访问属性。

我不确定你目前在 C++ 中是否可以做得更好。

原文: https://lemire.me/blog/2024/12/16/accessing-the-attributes-of-a-struct-in-c-as-array-elements/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • Elad Gil
  • Ellie Huxtable
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mostly metrics
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme