在C/C++(以及该系列的许多语言)中,根据条件声明和初始化变量的常用习惯用法是使用三元条件运算符:
int index = val > 0 ? val : -val
Run Code Online (Sandbox Code Playgroud)
Go没有条件运算符.实现上述相同代码的最惯用方法是什么?我来到以下解决方案,但它似乎相当冗长
var index int
if val > 0 {
index = val
} else {
index = -val
}
Run Code Online (Sandbox Code Playgroud)
还有更好的东西吗?
我正在使用http
Go中的包来处理POST请求.如何从Request
对象访问和解析查询字符串的内容?我无法从官方文档中找到答案.
我一直想知道是否有创建学校时间表算法的已知解决方案.基本上,它是关于优化给定班级 - 学科 - 教师协会的"小时分散"(在教师和班级案例中).我们可以假设我们在输入中有相互关联的课程,课程科目和教师,并且时间表应该适合在上午8点到下午4点之间.
我想可能没有准确的算法,但也许有人知道一个很好的近似或开发它的提示.
我知道你可以定义init
在任何包中调用的函数,这些函数将在之前执行main
.我用它来打开我的日志文件和我的数据库连接.
有没有办法定义程序结束时要执行的代码,因为它到达main
函数的末尾或因为它被中断了?我能想到的唯一方法是terminate
在main使用的每个包上手动调用deffered 函数,但这非常冗长且容易出错.
如何生成包含Rust中所有整数的列表?我正在寻找相当于Haskell [n..m]
或Python的,range(n, m+1)
但找不到任何东西.
我知道这个int::range
功能,并认为这是我正在寻找的东西,但它是在一个范围内迭代,而不是产生它.
我有一个函数返回a Card
,这是一个struct
类型,或一个错误.
问题是,如何在发生错误时从函数返回?nil
对结构无效,我的Card
类型没有有效的零值.
func canFail() (card Card, err error) {
// return nil, errors.New("Not yet implemented"); // Fails
return Card{Ace, Spades}, errors.New("not yet implemented"); // Works, but very ugly
}
Run Code Online (Sandbox Code Playgroud)
我找到的唯一解决方法是使用a *Card
而不是a Card
,a或者nil
在出现错误时使用它,或者Card
在没有错误发生时将其指向实际,但这非常笨拙.
func canFail() (card *Card, err error) {
return nil, errors.New("not yet implemented");
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法 ?
编辑:我找到了另一种方式,但不知道这是否是惯用的甚至是好的风格.
func canFail() (card Card, err error) {
return card, errors.New("not yet implemented")
}
Run Code Online (Sandbox Code Playgroud)
既然card
是一个命名的返回值,我可以在不初始化的情况下使用它.它以自己的方式归零,我并不在乎,因为调用函数不应该使用这个值.
这可能是一个简单的问题,我根本不掌握C++ 11模板.
我有一个通用的矢量类,不是std::vector<T>
出于性能原因(非常具体的代码).
我观察到检查是否T
是POD,如果是,执行特殊计算,效率要高得多:
void vec<T>::clear() {
if (!std::is_pod<T>::value) {
for (int i = 0; i < size; i++) {
data[i].~T();
}
}
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我没有T
为每个项目调用析构函数(size
可能非常大)并且性能得到了提升.但是if (!std::is_pod<T>::value)
一旦编译模板,测试就没用了:而不是编译成:
void vec<int>::clear() {
if (false) {
for (int i = 0; i < size; i++) {
data[i].~int();
}
}
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望它被编译为:
void vec<int>::clear() {
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器"聪明"是否足以跳过if (false)
块或if (true)
测试?我是否必须以不同的方式编写代码?
我正在制作一个产生大量数据的C++ 11类.该数据目前来自数据库,并不能完全适合内存.我想为用户提供一个迭代器,其行为类似于常规的STL迭代器,但这将是懒惰的.更准确地说,我可以做类似的事情:
for (auto& item : big_bunch_of_data) {
do_stuff_with(item);
}
Run Code Online (Sandbox Code Playgroud)
仅在每次迭代时从数据库中检索项目.如果我是对的,这个新语法就是糖
for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) {
do_stuff_with(*it);
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着通过提供begin
,end
并且operator++
,我可以有所期望的行为?而且,这些方法应该做什么?我的意思是,我可以让他们懒惰而不破坏东西吗?
我有一个以这种方式描述的类:
class Foo {
int size;
int data[0];
public:
Foo(int _size, int* _data) : size(_size) {
for (int i = 0 ; i < size ; i++) {
data[i] = adapt(_data[i]);
}
}
// Other, uninteresting methods
}
Run Code Online (Sandbox Code Playgroud)
我无法改变那门课程的设计.
如何创建该类的实例?在调用构造函数之前,我必须保留足够的内存来存储其数据,因此它必须在堆上,而不是在堆栈上.我想我想要的东西
Foo* place = static_cast<Foo*>(malloc(sizeof(int) + sizeof(int) * size));
*place = new Foo(size, data); // I mean : "use the memory allocated in place to do your stuff !"
Run Code Online (Sandbox Code Playgroud)
但我找不到办法让它发挥作用.
编辑:正如评论员所注意到的,这不是一个非常好的整体设计(使用非标准技巧data[0]
),唉这是一个我不得不使用的库...
我想创建一个Vec<T>
并为它腾出一些空间,但我不知道该怎么做,令我惊讶的是,官方文档中几乎没有关于这个基本类型的内容.
let mut v: Vec<i32> = Vec<i32>(SIZE); // How do I do this ?
for i in 0..SIZE {
v[i] = i;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建一个空的Vec<T>
并用push
es 填充它,但我不想这样做,因为我不总是知道,当在索引处写入值时i
,如果已经插入了一个值.出于明显的性能原因,我不想写下这样的内容:
if i >= len(v) {
v.push(x);
} else {
v[i] = x;
}
Run Code Online (Sandbox Code Playgroud)
当然,我也不能使用vec!
语法.