标签: subscript-operator

Swift运算符`下标`[]

我是初学者,对Swift操作员没有先进的知识.

我有以下课程

class Container {
   var list: [Any] = [];
}
Run Code Online (Sandbox Code Playgroud)

我想实现运算符subscript []以便从中访问数据list.

我需要这样的东西:

var data: Container = Container()
var value = data[5]
// also    
data[5] = 5
Run Code Online (Sandbox Code Playgroud)

我也希望能够写出这样的东西:

data[1][2]
Run Code Online (Sandbox Code Playgroud)

是否可以考虑1来自的元素Containerarray

Thanx寻求帮助.

operator-overloading subscript-operator swift

19
推荐指数
2
解决办法
5991
查看次数

重载下标运算符"["

我试图为"["我创建的自定义类重载下标operator().我想弄清楚如何处理以下问题.

  • 你怎么能弄清楚操作员是在lhs还是rhs?即a[x] = foovsfoo = a[x]
  • 订阅整个维度时,foo = a[,x]如何识别第一个参数?
  • 当使用[seq(x,y)]时,它似乎正在扩展整个序列.有没有简单的方法来获得第一个,步骤和最后的值而不扩展?

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

这是一个示例代码:

setMethod("[", signature(x="myClass"),
          function(x, i, j, k, l) {
              if (missing(i)) { i = 0 }
              if (missing(j)) { j = 0 }
              if (missing(k)) { k = 0 }
              if (missing(l)) { l = 0 }
          })
Run Code Online (Sandbox Code Playgroud)

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

r operator-overloading subscript subscript-operator

10
推荐指数
3
解决办法
1543
查看次数

是C++标准中的int [指向数组的指针]?

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

char *a = new char[50];
for (int i = 0; i < 50; ++i) {
    i[a] = '5';
}
Run Code Online (Sandbox Code Playgroud)

它汇编.有用.它完全一样

char *a = new char[50];
for (int i = 0; i < 50; ++i) {
    a[i] = '5';
}
Run Code Online (Sandbox Code Playgroud)

是因为:

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

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

有趣的是,没有pointer[pointer]运营商,因此operator[]不是宏.

我知道这很糟糕.我知道阅读代码的人会感到困惑.但是我想知道这是不是偶然发生,它不会在一个遥远的地方工作,那里的独角兽有七条腿,而左边的脸颊上有角.

c++ arrays syntax pointers subscript-operator

9
推荐指数
1
解决办法
557
查看次数

在l值和r值的情况下重载下标运算符"[]"

我在我的班级Interval中重载[]运算符以返回分钟.

但我不知道如何使用[]运算符将值分配给分钟.

例如:我可以使用此声明

cout << a[1] << "min and " << a[0] << "sec" << endl;

但是我想重载[]运算符,这样我甚至可以使用分配值来分钟或秒

a[1] = 5;
a[0] = 10;
Run Code Online (Sandbox Code Playgroud)

我的代码:

#include <iostream>

using namespace std;

class Interval
{

public:

    long minutes;
    long seconds;

    Interval(long m, long s)
    {
        minutes = m + s / 60;
        seconds = s % 60;
    }

    void Print() const
    {
        cout << minutes << ':' << seconds << endl;
    }

    long …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading subscript-operator

6
推荐指数
3
解决办法
9277
查看次数

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

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

subscript(key: String) -> CKRecordValue? {
    get {
        return objectForKey(key) as CKRecordValue?
    }
    set {
        setObject(newValue, forKey: key)
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈溢出发生在getter中.(我从来没有尝试过的制定者,所以它可能有发生了.)我已经试过与实施objectForKey:,objectForKeyedSubscript:以及valueForKey:.所有都产生相同的结果:堆栈溢出.

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

UPDATE

它似乎objectForKeyedSubscript:通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.

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

一个理论

如果你在Swift中创建一个类,NSObjectsubscript使用a String作为键来实现它的方法,那就变成了objectForKeyedSubscript:.(对于"纯Swift"类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:是否存在来验证这一点.

CKRecord下降开始NSObject,实现subscript覆盖默认实现.此外,它似乎objectForKey:valueForKey:所有最终叫objectForKeyedSubscript:,这会导致(读:"是一样的")的调用subscript,这会导致堆栈溢出.

这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为定义setObject:forKeyedSubscript:与规范的类型签名略有不同:- …

subscript-operator swift cloudkit ckrecord

6
推荐指数
1
解决办法
825
查看次数

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

有很多与operator []相关的问题只有一个参数,但我找不到一个实际说明原因的问题.

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

是否有任何特殊原因(例如不兼容性),这种语法不在语言中,或者除了缺乏动机之外还有什么阻止它被添加?

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

c++ operator-overloading subscript-operator

5
推荐指数
1
解决办法
157
查看次数

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

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

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

#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct Books
{
        int ISBN;
        string Author;
        string Publisher;
        int Quantity;
        double Price;
};


class functions
{
        public:
                void READ_INVENTORY(Books, int, int);

};


// Function definitions

void READ_INVENTORY(Books array, int max, int position)
{
        ifstream inputFile;
        inputFile.open("inventory.dat");

        inputFile >> array[position].ISBN;
        inputFile >> array[position].Author;
        inputFile >> array[position].Publisher;
        inputFile >> array[position].Quantity;
        inputFile >> array[position].Price;

        cout << "The following data was read from inventory.dat:\n\n"
             << "ISBN: " << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays struct header-files subscript-operator

5
推荐指数
1
解决办法
1万
查看次数

当使用字符串文字初始化时,std :: strings是否以'\ 0'结尾?

我知道字符串对象不是空终止但为什么这应该工作?

std::string S("Hey");
for(int i = 0; S[i] != '\0'; ++i)
   std::cout << S[i];
Run Code Online (Sandbox Code Playgroud)

所以构造函数也复制了null终止符,但是不增加长度?为什么这么麻烦?

c++ string null-terminated subscript-operator

5
推荐指数
2
解决办法
2427
查看次数

指针是否支持“数组样式索引”?

(常见问题解答-此问题不断出现)

我假设读者知道指针算法是如何工作的。

int arr[3] = {1,2,3};
int* ptr = arr;
...
*(ptr + i) = value;
Run Code Online (Sandbox Code Playgroud)

老师/ C书籍不断告诉我,我不应该*(ptr + i)像上面的示例那样使用,因为“指针支持数组样式索引”,而我应该使用它ptr[i] = value;。那里没有论据-更容易阅读。

但是从C标准来看,我什么都没有找到,叫做“数组样式索引”。实际上,运算符[]并不期望任何一个操作数都是数组,而是指针或整数!

6.5.2.1数组下标

约束条件

其中一个表达式的类型应为“完成对象类型的指针”,另一个表达式的类型应为整数,结果的类型应为“ type ”。

为什么数组下标运算符不期望数组?标准错了吗?我的老师/ C书困惑了吗?

c arrays pointer-arithmetic subscript-operator array-indexing

5
推荐指数
1
解决办法
111
查看次数

C++对数组下标有什么期望?

在C中,阵列订阅:a[b]仅仅是还原糖等效指针运算之后解除引用的句法:*(a+b)(如所解释的,比方说,在这里).

对于基类型,如何在C++中解释数组订阅?(不适用于我们有超载语义的类)?而且,更具体地说,C++期望作为下标出现什么类型?是一个ptrdiff_t吗?

c++ arrays standards pointers subscript-operator

4
推荐指数
2
解决办法
1618
查看次数