我有以下代码的2个问题:
如果在空堆栈上调用pop(),我应该抛出异常吗?
class Stack(object):
def __init__(self):
self.storage = []
def isEmpty(self):
return len(self.storage) == 0
def push(self,p):
self.storage[:0] = p
def pop(self):
"""issue: throw exception?"""
return None
Run Code Online (Sandbox Code Playgroud)我正在研究std::ratio<>C++ 11标准中的类,它允许编译时合理算术.
我发现模板设计和用类实现的操作过于复杂,并且没有找到任何理由为什么他们不能通过实现一个非常简单的理性类并constexpr为操作符定义函数来使用更直接和直观的方法.结果将是一个更容易使用的类,并且编译时优势将保持不变.
有没有人知道当前std::ratio<>设计的优点与使用的简单类实现相比constexpr?实际上,我无法找到当前实现的任何优势.
我正在转换一些旧的Python代码pathlib而不是os.path用于大多数与路径相关的操作,但我最终遇到了以下问题:我需要向已经有扩展的路径添加另一个扩展(而不是替换它).有了os.path,因为我们仅仅处理字符串,该解决方案是与字符串操作添加扩展:
newpath = path + '.res'
Run Code Online (Sandbox Code Playgroud)
它不起作用,pathlib.Path因为它不允许连接任意字符.我能找到的最接近的是:
newpath = path.with_suffix(path.suffix + '.res')
Run Code Online (Sandbox Code Playgroud)
它看起来像一个变通方法,因为它最终仍然使用字符串添加.它有一个新的陷阱,因为我首先忘记了已经有几个扩展并且你想要添加一个新扩展的情况,导致以下代码恢复旧的行为:
newpath = path.with_suffix(''.join(path.suffixes) + '.res')
Run Code Online (Sandbox Code Playgroud)
现在它不会感到简洁和干净,因为它使用越来越多的字符串操作来实现旧行为而不是纯路径操作.Path.suffixes存在的事实意味着库的开发人员考虑了文件可以有多个扩展的情况,但我找不到简单地向路径添加新扩展的方法.我是否有更多惯用的方式来实现相同的行为?
编辑:实际上path.with_suffix(path.suffix + '.res')足以处理已经有几个文件扩展名的情况,即使它对我来说并不是很明显.
我读的意见终极版约在一周的香草萨特的大师virtual功能,终于看见他提这一点:
[...]"最终的使用是罕见的" - 嗯,他们有点.我不知道很多,在标准化过程中,Bjarne反复询问它解决的问题和应该使用的模式的例子,我不记得任何突出的主要问题.我唯一知道的是,如果你正在定义一个库模块(它还不是标准概念),那么使叶子类最终可以为编译器提供更多信息来虚拟化调用,因为知道库外的代码"进一步推导出来,但我不确定这些日子在整个计划优化(包括积极的虚拟化)的存在下有多重要.
这个答案没有提供很多final关于课程用例的例子,我很想知道它可以解决哪些问题.你知道吗,或者final课堂上只会变成一些模糊不清且几乎未使用过的功能?
最近,我试图在Python中存储和读取文件中的信息,并遇到了一个小问题:我想从文本文件中读取类型信息.从string到int或float的类型转换非常有效,但是从字符串到类型的类型转换似乎是另一个问题.当然,我尝试过这样的事情:
var_type = type('int')
Run Code Online (Sandbox Code Playgroud)
但是,type不是用作强制转换,而是用作查找变量类型的机制,这实际上就str在这里.
我找到了一种方法:
var_type = eval('int')
Run Code Online (Sandbox Code Playgroud)
但我一般尽量避免类似的功能/报表eval或exec在那里我可以.所以我的问题如下:是否有另一种pythonic(和更具体的)方法将字符串转换为类型?
我不明白为什么这个代码与g ++ 4.7.2扼杀:
#include <chrono>
main ()
{
std::chrono::system_clock::time_point t1, t2 ;
std::chrono::seconds delay ;
t1 = std::chrono::system_clock::time_point::max () ;
t2 = std::chrono::system_clock::now () ;
delay = t1 - t2 ;
// t1 = t2 + delay ;
// t1 = t2 - delay ;
}
Run Code Online (Sandbox Code Playgroud)
有错误:
test.cc: In function ‘int main()’:
test.cc:10:18: error: no match for ‘operator=’ in ‘delay = std::chrono::operator,<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> >, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >((*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& …Run Code Online (Sandbox Code Playgroud) 我试图找到一些简单的方法来安置元素,std::vector<std::shared_ptr<int>>但不能带来任何东西.std::shared_ptr将指针作为参数,所以我仍然可以这样写:
std::vector<std::shared_ptr<int>> vec;
vec.emplace_back(new int(10));
Run Code Online (Sandbox Code Playgroud)
但是,new如果可能的话,我不想手工使用,如果可能的话,我宁愿使用std::make_shared.问题是,如果我真的想要使用它,我必须使用它push_back而失去就地构造的优势:
std::vector<std::shared_ptr<int>> vec;
vec.push_back(std::make_shared<int>(10));
Run Code Online (Sandbox Code Playgroud)
有没有什么办法让两者的优点emplace_back和std::make_shared?如果没有,在这种情况下是否应该遵循指引?
编辑:实际上,我问了这个问题,但有一个无关的问题.Andy的答案是好的,并且使用这两个emplace函数并没有任何实际问题std::make_shared.
我无法理解下面两个代码片段之间的区别.有人可以帮我解释一下吗?
首先,我必须说我有很多类扩展了一个名为的超类BaseEntity,那么以下片段的区别,优点和缺点是什么?
// 1
public <T extends BaseEntity> T getName(T t) {
return t;
}
// 2
public BaseEntity getName(BaseEntity t) {
return t;
}
Run Code Online (Sandbox Code Playgroud) C++ 14似乎即将到来,编译器已经在尝试实现这个新版本的核心功能.我正在研究GCC对这些核心功能的支持,并注意到二进制文字部分:GCC实现了它们,但似乎在GNU二进制文字和C++ 14二进制文字之间有所区别.以下是两者的相应参考:
我试图找到他们两个之间的一些差异,因为GCC似乎有所作为,但找不到任何东西.你们中有谁知道更多可能的不兼容性吗?
我有模板化的gray_code类,它用于存储一些无符号整数,其基础位以格雷码顺序存储.这里是:
template<typename UnsignedInt>
struct gray_code
{
static_assert(std::is_unsigned<UnsignedInt>::value,
"gray code only supports built-in unsigned integers");
// Variable containing the gray code
UnsignedInt value;
// Default constructor
constexpr gray_code()
= default;
// Construction from UnsignedInt
constexpr explicit gray_code(UnsignedInt value):
value( (value >> 1) ^ value )
{}
// Other methods...
};
Run Code Online (Sandbox Code Playgroud)
在一些通用算法中,我写了这样的东西:
template<typename UnsignedInt>
void foo( /* ... */ )
{
gray_code<UnsignedInt> bar{};
// Other stuff...
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我期望bar零初始化,因此bar.value要进行零初始化.但是,在遇到意外错误之后,似乎bar.value用垃圾(确切地说是4606858)初始化而不是0u.这让我感到惊讶,所以我去了cppreference.com,看看上面那条线应该做什么......
根据我的内容,表单T object{};对应于 …
c++ ×6
c++11 ×3
python ×3
c++14 ×2
g++ ×2
casting ×1
constructor ×1
gcc ×1
generics ×1
gotw ×1
inheritance ×1
java ×1
literals ×1
methods ×1
pathlib ×1
python-3.x ×1
shared-ptr ×1
typesafe ×1