- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为 A* 搜索算法实现开放列表 (OL) 类。 OL 基本上是搜索节点的专用优先级队列。在描述 A* 算法的伪代码中经常看到这样的符号:
successorNode -> OL // put the successor node into OL
...
curNode <- OL // get the best node from OL and store it in curNode
三个问题:
我的 OL 类通过重载移位运算符来支持类似的符号是否有意义:
OL ol;
...
OL << successorNode;
...
OL >> curNode;
(仅当对 1. 的回答为"is"时)我能否尽可能地支持这一点(即 cout
和 cin
用于内置类型):
OL ol;
...
successorNode >> OL;
...
curNode << OL;
(仅当 1. 的答案为"is"时)移位运算符的这种用法对标准容器是否有意义:
vector<int> v;
v << 5; // instead of v.push_back(5)
编辑:这个问题的目的有两个:
询问提议的设计是否违反了重载运算符应该模仿这些运算符对内置/标准类型的含义的原则。
询问为什么不使用移位运算符来简化标准容器的使用。
最佳答案
您问题的答案很可能主要基于个人意见,因为没有硬性规定允许/禁止这种运算符重载的使用。因此,我将提出论据来帮助您决定这是否是一个好主意,而不是硬性回答。
关于您的前两个问题:
从最小意外原则的角度考虑一下。如果有人看到你的代码,他会期待什么?会立即清楚这是什么意思,或者,作为相反的极端,他(她)会期待完全不同的东西吗?如果适用,重载值得惊喜吗?比如,了解了operators是干什么的,是不是让代码更清晰?如果利大于弊,那就去吧!否则,不要。
作为这一点的一个侧面节点,我什至遇到了这样的论点,即 iostream 运算符是运算符重载的一个坏例子,因为它们不移动整数。但是,我倾向于不同意,并将其视为个人意见。
应用于您当前的情况:用户可能希望通过调用接线员获得其他结果吗?例如。他可能会期待队列中的另一个结果吗?如果是这样,请不要重载。还是希望用户熟悉伪代码符号,并看到相似之处?如果是这样,请重载!
关于第三个问题:
有些人同意,有些人不同意。例如,Qt 框架的容器支持这种用法:
QList<int> list;
list<<5;
总结:
答案取决于它是否使您的代码更具可读性(当然还有个人意见)。
注意:所有这些仅适用于没有风格指南或禁止使用运算符重载的情况!
关于c++ - 为 I/O 以外的事物重载移位运算符是否是一个好的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605526/
我想将这个无符号数:1479636484000 向右移动 7 位。这在 JavaScript 中可能吗? 两者 1479636484000 >> 7 和 1479636484000 >>> 7 返回错
鉴于以下代码: import matplotlib.pyplot as plt import numpy as np x = [1.0, 1.1, 2.0, 5.7] y = np.arange(le
我有一个低级键盘钩子(Hook),目前允许我从任何应用程序(包括游戏)中控制媒体播放器。 它通过查看捕获的特定击键来工作。 我想扩展它以查找键的组合。我可以对一些逻辑进行硬编码,但我觉得必须有一种更合
我需要一些帮助来理解这段C代码。我不知道这里的“L”和“\”是什么?请也说明一点:) #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>2
我正在查看一段代码: int result = 0 ; char byte = foo[j] for (i = 7 ; i>0 ; i--) { byte = (byte & ~0x1)>>1
我们有一个项目要求我们编写一个程序,允许用户输入一系列数字“将数字读入数组以进行进一步处理,用户通过输入负数表示他们已完成(负数不用于计算),在读取所有数字后执行以下操作,总结输入的#,计算输入的#,
锁定。有disputes about this question’s content正在解决中。它目前不接受新的答案或互动。 def menu(): choice = input("Pres
为什么如果 int x = -1 // binary: 11111111111111111111111111111111 x = x >>> 31; 我们有 000000000000000000000
我的问题其实应该很简单:我有一个玩家对象数组。(玩家[])我想要一个函数来旋转这个数组直到一个索引: public void rotateArray(Object[] array, int index
我有一个编码为 boost 动态位集的数字列表。我根据此列表中的任何数字可以采用的最大值动态选择此位集的大小。所以假设我有从 0 到 7 的数字,我只需要三位,我的字符串 0,2,7 将被编码为000
我能想到一些令人讨厌的低效方法来完成这项任务,但我想知道最好的方法是什么。 例如,我想复制一个字节中从第 3 位开始的 10 个字节,并像往常一样复制到一个指针。 有没有比一次复制一个移位字节更好的方
我正在尝试为该问题添加更多规则,并且该规则一直给我带来这种转变/减少冲突的能力,我不知道为什么会这样做,并且在过去的24小时内我一直在尝试解决问题 FuncDecl : RetTyp
This question already has answers here: Why does it make a difference if left and right shift are us
我在 Perl 中遇到这个问题已经有几天了,在搜索了无数的手册页、perldocs 和谷歌搜索了太多的搜索词之后,希望这里有人能帮助我。 我得到两个表示十六进制值的字符串,即“FFFF”,而不是 Pe
我有一个主 div,两个 div 水平并排放置在这个父 div 中。 .parent{ height: 360px; margin-top: 0px; bo
我想 float 我的元素列表并从第二个元素创建一个移动效果。 如何避免第二个 .item 之后的“清除”行为? .shift { float: right; width: 50%;
我正在使用 SSE3 优化我的代码。代码中有一点迫使我将 vector 中的所有元素移动一个元素 v[0] = 0 //v is some char* and N = v.size() for(i
.file "calcnew.c" .text .globl calcnew .type calcnew, @function calcnew:
我有一个点对象: class Point { final int x,y; ... } 因为这些点将在我的代码中到处使用/创建,所以我想开始使用 guavas 缓存。不幸的是
x = "Foo 890 bar *()" 如何将包括 "*()" 在内的小写字母“未移位”返回到 890?期望的结果: foo 890 bar 890 不需要的: x.lower() => "foo
我是一名优秀的程序员,十分优秀!