Skip to content

搞英语 → 看世界

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

Menu
  • 首页
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
  • Product Hunt
  • Visual Capitalist
  • Elon Musk
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/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abdisalan Mohamud
  • Addy Osmani
  • Aeon
  • Ahoy There! on THT's den
  • Alec Muffett
  • Andreas
  • anhvn
  • Ankaph
  • Annie
  • Armin Ronacher
  • Ask Hacker News Weekly
  • Astro Blog
  • Austin White
  • Backlinko
  • Better Dev Link
  • Building Pika Out Loud
  • Caleb Hearth
  • Cédric Aellen
  • Chip Huyen
  • Colossal
  • Cooltools by KK
  • CoRecursive
  • Craig Mod
  • Curt Merrill
  • Dan Abramov's Overreacted Blog RSS Feed
  • Daniel Lemire
  • Daniel Stenberg
  • Daring Fireball
  • David H
  • David Heinemeier Hansson
  • Dayu | 大宇
  • Ed Zitron
  • Ersei
  • Ersei 'n Stuff
  • Evan Martin
  • First Page Sage
  • Founder Weekly
  • FuzzyGrim
  • Gabriel
  • Good Enough
  • Gregory Hammond
  • Habib
  • How They Make Money
  • I Love Charts
  • Ian Betteridge
  • Ivaylo Durmonski
  • Jason Kottke
  • Jason Kratz
  • Jeff Perry
  • John D. Cook
  • Jonas Hietala
  • Jonathan Snook
  • jwb
  • Kevin Kelly
  • Kevin Yank
  • Kirsty
  • Kush
  • Loris Cro
  • Maarten van Gompel
  • Manas J. Saloi
  • Mandy Brown
  • Matt Fantinel
  • Matt Mullenweg
  • Mere Civilian
  • Ness Labs
  • News Letter
  • Nicholas Carlini
  • Nicolas F. R. A. Prado
  • Niko
  • Nir Eyal
  • Noah Smith
  • Pedro Lopes
  • Positive News
  • Predrag Gruevski
  • Rachel Kroll
  • Recomendo by KK
  • rendezvous with cassidoo
  • Rest of World
  • Ruben Schade
  • Scott Galloway
  • Sébastien Etter
  • SEMrush Blog
  • Seth Godin
  • Shariq Raza Qadri
  • Simon Willison
  • Six Colors
  • Slashdot
  • Spectre Collie
  • Spyglass
  • storytelling with data
  • Streamline Blog
  • Tableau Blog
  • tekphloyd
  • The Alchemy of Money
  • The Independent Variable
  • The Marginalian
  • thriftmac
  • Tim Bray
  • Tim Ferriss
  • Tim Kellogg
  • TLDR
  • Topslakr
  • Track Awesome list
  • Trump
  • Victor Kropp
  • Vincent Ritter
  • Vox
  • Westenberg
  • Xe Iaso
  • xkcd
  • Yuri Cunha
  • Zarar
  • 未分类
  • 英文媒体
  • 英文推特
  • 英文独立博客
  • 读写错误
©2026 搞英语 → 看世界 | Design: Newspaperly WordPress Theme