是否可以在不实例化的情况下在c ++中声明变量?我想做这样的事情:
Animal a;
if( happyDay() )
a( "puppies" ); //constructor call
else
a( "toads" );
Run Code Online (Sandbox Code Playgroud)
基本上,我只是想声明条件的外部,以便它获得正确的范围.
有没有办法在不使用指针和a在堆上分配的情况下执行此操作?也许引用聪明的东西?
我看到很多c ++代码看起来像这样:
for( const_iterator it = list.begin(),
const_iterator ite = list.end();
it != ite; ++it)
Run Code Online (Sandbox Code Playgroud)
与更简洁的版本相反:
for( const_iterator it = list.begin();
it != list.end(); ++it)
Run Code Online (Sandbox Code Playgroud)
这两个约定之间的速度会有什么不同吗?由于list.end()只被调用一次,因此第一个会稍快一些.但由于迭代器是const,似乎编译器会将此测试从循环中拉出来,为两者生成等效的汇编.
c++ compiler-construction optimization iterator coding-style
我有许多准相关项目,我想版本控制.在SVN中,我将它们设置为单个项目中的多个目录
/scripts #updates in sync with project1 & project2
/project1 #requires database
/project2 #requires database
/database
Run Code Online (Sandbox Code Playgroud)
当然,这个玩具示例可以使用其他SVN布局,但这种布局具有以下优点:
svn co repo/project2; svn co repo/database.如果project1很大,这可以节省大量的存储和时间.由于无法克隆mercurial repo的单个目录,因此这种范例不能很好地映射到mercurial .所以我的问题是:在mercurial中存储大型密切相关项目的最常用方法是什么?
我的想法:
我正在处理的一些遗留代码有一个宏,它返回一个以逗号分隔的列表,用作函数参数.这很难看,但配置文件包含许多这些,现在很难改变.
#define XY1 0,0
#define XY2 1,7
...
void fun_point(x,y);
fun_point(XY1);
Run Code Online (Sandbox Code Playgroud)
只要它是一个被调用的函数,它就可以正常工作.但是,当尝试使用参数调用另一个宏时,整个字符串被视为一个参数,而不是将逗号分割为两个参数
#define MAC_POINT(x,y) (x+y)
MAC_POINT(XY1) #not expanded by preprocessor
Run Code Online (Sandbox Code Playgroud)
在不更改XY定义的情况下,是否存在解决此问题的方法?
如何指定一个必须满足多个协议的对象?例如,假设我需要一个同时满足Reversible和 的对象Iterable:
from typing import Iterable, Reversible
l = [1, 2, 3]
r: Reversible[int] = l
i: Iterable[int] = l
reversed(r) # fine
iter(i) # fine
reversed(i) # err since not iterable
iter(r) #err since not reversible
Run Code Online (Sandbox Code Playgroud)
我想以某种方式注释一个可以进行所有操作的变量。例如(组成语法):
T = TypeVar('T')
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]
ri: ReversibleIterable[int] = l
reversed(ri) # fine
iter(ri) # fine
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?我使用协议、有界 TypeVar 等寻找解决方法,但无法使其工作。
我正在尝试解析 CSV 文件(来自外部数据源),其中其中一列使用不一致的字符编码。我不想尝试让数据提供者使用一致的编码,而是只想将该列读取为二进制数据。然而,pandas.read_csv似乎在解析之前将整个文件解码为字符串,因此这给了我错误(UnicodeDecodeError)。这是一个玩具示例(python 3):
>>> from io import BytesIO\n>>> import pandas as pd\n>>> csv = b\'Encoding,Data\\nascii,abc\\nwindows-1252,\\xae\\nutf-8,\\xe2\\x80\\x9c1\\xe2\\x80\\x9d\\n\'\n>>> pd.read_csv(BytesIO(csv))\nTraceback (most recent call last):\n File "pandas/_libs/parsers.pyx", line 1130, in pandas._libs.parsers.TextReader._convert_tokens\n File "pandas/_libs/parsers.pyx", line 1254, in pandas._libs.parsers.TextReader._convert_with_dtype\n File "pandas/_libs/parsers.pyx", line 1269, in pandas._libs.parsers.TextReader._string_convert\n File "pandas/_libs/parsers.pyx", line 1459, in pandas._libs.parsers._string_box_utf8\nUnicodeDecodeError: \'utf-8\' codec can\'t decode byte 0xae in position 0: invalid start byte\nRun Code Online (Sandbox Code Playgroud)\n\n我想要一个与此等效的结果:
\n\n>>> df = pd.DataFrame({\'Encoding\': [\'ascii\',\'windows-1252\',\'utf-8\'],\n... \'Data\': [b\'abc\',b\'\\xae\',b\'\\xe2\\x80\\x9c1\\xe2\\x80\\x9d\']})\n>>> df\n Encoding Data\n0 ascii b\'abc\'\n1 windows-1252 b\'\\xae\'\n2 utf-8 b\'\\xe2\\x80\\x9c1\\xe2\\x80\\x9d\'\nRun Code Online (Sandbox Code Playgroud)\n\n … c++ ×3
python ×2
coding-style ×1
csv ×1
declaration ×1
iterator ×1
macros ×1
mercurial ×1
mypy ×1
optimization ×1
pandas ×1
scope ×1
svn ×1
type-hinting ×1
types ×1