问题标签 [subscript-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
220 浏览

c++ - C++ 下标运算符

我写了一个代码,但它似乎不起作用。每次执行程序时,我都会收到此错误

运行时检查失败 #2 - 变量 'ary' 周围的堆栈已损坏

无论如何,这是我的代码(这是一个小代码)

你也可以帮助下标运算符吗,我似乎不明白如何声明和使用它们。同样,在没有首先理解程序的情况下编写程序似乎很愚蠢,但无论如何,我们将不胜感激:)

0 投票
4 回答
192 浏览

c++ - C++ 重载运算符 []

我制作了一个应用程序,您可以在其中键入要输入的书籍数量并使用重载运算符([])但是每次我给出一个存储数组的指针时,它都会给我一个错误,例如

2 IntelliSense:表达式必须具有整数或无范围枚举类型 Line:11 Column:24 Library Books

错误 1 ​​错误 C2440:“正在初始化”:无法从“std::string”转换为“unsigned int”行:11 列:1 图书馆书籍

但无论如何这是我的代码:

我也不是 100% 确定我是否正确编码,如果还有错误,请告诉我,谢谢。

0 投票
4 回答
1832 浏览

r - 重载下标运算符“[”

我正在尝试为"["我创建的自定义类重载下标运算符 ()。我试图弄清楚如何处理以下问题。

  • 您如何确定操作员是在 lhs 还是 rhs 上?即a[x] = foofoo = a[x]
  • 当下标整个维度foo = a[,x]时,我如何识别第一个参数?
  • 当使用 a[seq(x,y)] 时,它似乎在扩展整个序列。有没有一种简单的方法可以在不扩展的情况下获得第一步、一步和最后一个值?

编辑:我的第一点收到了多个答案。在这个过程中,我已经找到了第二个的答案。您可以使用“缺失”功能来确定存在哪些参数。

这是一个示例代码:

我已经接受了这个问题的答案,因为第 3 点对我来说是最不重要的。

0 投票
3 回答
1203 浏览

c++ - Array Subscription: returning Reference vs proxy class method

While searching for methods for overloading Subscript('[]') operator for template class, I came across two different techniques.

First Technique:

Overloading the operator [] returning pointer to the container directly, which will allow both reading value and assigning value. A sample implementation of this technique:

With main() as:

Output:

Second Technique:

Second technique involves declaring a proxy class and overloading the operator = via that class. A sample implementation of this technique:

With same main() we get same output.

I personally like the second method. But, I really want to compare these two methods. What are the major functional difference of these two techniques. What advantages each of these method have?

0 投票
3 回答
675 浏览

c++ - 是 C++ 中的 int[pointer-to-array] - 标准吗?

据我所知,可以编写以下代码:

它编译。有用。它的作用

难道仅仅是因为:

  • a[b]默认情况下被实现为宏*(a + b),两个代码示例都有效的事实只是意外/编译器特定的
  • 它在某处标准化,并且此类算法的结果在每个平台上都应该相同

假设加法应该是可交换的是合理的,但如果我们operator[]以这种方式实现,我们已经使其他东西可交换,这可能不是我们想要的。

有趣的事实是没有pointer[pointer]运算符,所以operator[]也不是宏。

我知道这很糟糕。我知道这会让阅读代码的人感到困惑。但我想知道这是否只是一个意外,它在独角兽有七只腿且左脸颊上有角的遥远土地上行不通。

0 投票
2 回答
91 浏览

c++ - 有没有办法从更简洁的东西中获取 (*pointer)[ index ] 功能?

我有一个类来表示一维光谱。底层数据类型是一个简单的浮点数组。为了操纵频谱的元素,我重载了下标运算符,如下所示:

不幸的是,这个类的几乎所有用途都是作为指针,所以我现在有一些烦人的(*pointerToSpectrum)[ index ]符号要处理。

我最初有两个想法:

我的第一个想法是重载 的下标运算符OneDSpectrum*,但这看起来就像一个装满潜在问题和麻烦的篮子。

我的第二个想法是为 OneDSpectrums 制作某种自定义智能指针。

所以我的问题是: 获得功能是否合理?还是我应该处理大量使用?SmartPointerToSpectrum[ index ](*pointerToSpectrum)[ index ](*pointerToSpectrum)[ index ]

0 投票
1 回答
236 浏览

ios - Swift 数组下标索引中的错误?

我已经从我的项目中分离出一些可以粘贴到 Playground 中的 Swift 代码。它在正常的 Xcode 编辑和 Playground 中都会产生错误“找不到接受提供的参数的 '+' 的重载” 。该错误是指最后(非平凡)行。

如果我取消注释“let iPlus1...”这一行并进行以下编辑,Swift 将接受该代码。

如果我取消注释“let temp...”行并进行以下编辑,Swift 将再次接受该代码。

这些编辑对我来说都没有任何意义,因为它们都是看似微不足道的替换。我知道 Swift 永远不会为我隐式类型转换。在原始代码中似乎没有尝试任何隐式类型转换——所有 Ints 和 Doubles 都按预期声明。我开始相信这是 Swift 数组下标索引的错误。

0 投票
1 回答
309 浏览

c++ - 为什么 operator[] 只接受一个参数?

有很多与 operator[] 相关的问题只接受一个论点,但我找不到一个真正说明原因的问题。

matrix[0, 3]例如,调用ElementT& operator[](SizeT x, SizeT y)函数似乎是语言的一个非常自然的扩展。

是否有任何特殊原因(例如不兼容)该语法不在该语言中,或者除了缺乏动机实际上阻止它被添加之外的任何其他原因?

(注意:这已被标记为重复,但事实并非如此。这个问题是“为什么语言中没有这种语法?”而不是“我如何解决这个问题?”如前所述,有很多问题解决后者,但没有一个回答前者。)

0 投票
3 回答
935 浏览

swift - 在 Swift 中在 CKRecord 上定义下标时堆栈溢出

这个问题CKRecord询问是否可以在 Swift中使用下标。虽然我已经知道如何做提问者想要的,但它的每一个排列都会给我一个堆栈溢出:

堆栈溢出发生在 getter 中。(我从未尝试过 setter,所以它也可能在那里发生。)我尝试使用objectForKey:objectForKeyedSubscript:valueForKey:. 都产生相同的结果:堆栈溢出。

这很奇怪,因为CKRecord肯定是用 Objective-C 编写的。为什么会递归调用 Swift 的subscript方法?这没有道理。Nate Cook 在回答提问者时想知道为什么 Swift 不会objectForKeyedSubscript:自动桥接。好吧,也许执行此操作的代码没有完全烘焙,但导致了这个问题。我将不得不与另一个具有objectForKeyedSubscript:.

更新

看起来objectForKeyedSubscript:通常是桥接的。我使用适当的方法在 Objective-C 中创建了一个类,将其添加到桥接头中,索引器就在那里并且没有问题地编译。更好的是,它在没有堆栈溢出的情况下工作。

这意味着正在发生一些非常不寻常的事情CKRecord

理论

如果您在 Swift 中创建一个类,该类从a 作为键继承NSObject并在其上实现该subscript方法,则它String变为objectForKeyedSubscript:. (对于“纯 Swift”类,我怀疑情况并非如此。)您可以通过将 Swift 类导入到 Objective-C 并验证它objectForKeyedSubscript:是否存在来验证这一点。

由于CKRecord继承自NSObject,因此实现subscript会覆盖默认实现。objectForKey:此外,似乎valueForKey:所有最终都调用objectForKeyedSubscript:了 ,这导致(阅读:“与”相同)调用subscript,从而导致堆栈溢出。

这可以解释为什么会发生堆栈溢出。它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为 的定义setObject:forKeyedSubscript:与规范的类型签名略有不同:- (void)setObject:(id <CKRecordValue>)object forKeyedSubscript:(NSString *)key;. 这对 Objective-C 没有影响,但可能会导致“桥接代码”出错。毕竟,Swift 是相当新的。

0 投票
1 回答
29538 浏览

c++ - 结构类型“不提供下标运算符”

我正在尝试将文件中的值读取到结构数组中。但是,我不断收到编译器错误,告诉我我的结构 Books 没有提供下标运算符,我迷路了。

结构包含在头文件中,而结构数组的声明在 main() 中。这是 functions.h 头文件中的(相关)代码:

这是 main 中的结构声明数组及其使用方式:

编译后,我收到 10 条错误消息(每次使用 array[position] 时有一条),状态为:error: type 'Books' does not provide a subscript operator