我在 macOS 上使用 Python 3.8.9 和 IPython 8.0.1。当我输入任何内容时,它会显示基于过去命令的预测建议。凉爽的。
然而,我如何真正接受这个建议呢?我尝试了明显的:选项卡,它不接受建议,而是打开一个包含不同建议的菜单,而原始建议仍然存在(参见屏幕截图)。
我也尝试过太空和返回,但这两者都表现得好像从未提出过这个建议。我到底如何使用ipython 自动建议?或者 tab 应该可以工作,但我的 ipython 构建有问题还是什么?
我注意到一本教科书,您可以为标准库函数提供自己的实现,例如swap(x,y)通过函数重载的模板特化.这对于可以从赋值交换以外的其他东西中受益的任何类型都是有用的,STL containers例如(我已经知道了已经写过的掉期).
我的问题是:
什么更好:模板专业化为您的专业交换实现,或函数重载提供您希望在没有模板的情况下使用的确切参数?
为什么更好?或者如果他们是平等的,为什么呢?
c++ stl overloading standard-library template-specialization
C++中的初始化列表构造函数经常会引起麻烦; 例如
using std::vector;
using std::string;
vector<string> v{3}; // vector of three empty strings
vector<int> u{3}; // vector of one element with value 3
Run Code Online (Sandbox Code Playgroud)
(只是为了澄清,我的意思是<int>构造函数是一个初始化列表构造函数,而<string>一个不是.)
该int案例与初始化列表构造函数匹配,而string案例则不匹配.这有点难看,常常会造成麻烦.在Scott Meyers的Effective Modern C++的早期章节(第7项)中也注意到了这一点,他将其描述为标准中有些令人不快的部分,每当初始化列表构造函数可用时,编译器将跳过箍尝试匹配它,优先于每个其他构造函数.
当然,int case可以通过改变u{3}来轻松修复u(3),但这不是重点.
这是理想的行为吗?C++标准委员会是否有任何讨论或计划来解决这种模糊/不愉快?一个例子是要求初始化程序列表构造函数被调用,如下所示:vector<int> u({3})这已经是合法的.
C++ 11允许类内初始化:
struct Foo{
std::vector<std::string> v{3}; // vector of 3 empty strings
};
Run Code Online (Sandbox Code Playgroud)
如果我们想要在类中初始化一个int的向量,我们会得到其他东西:
struct Foo{
std::vector<int> v{3}; // vector of one element with value 3
};
Run Code Online (Sandbox Code Playgroud)
这个问题似乎是语言的限制,正如之前的问题所讨论的那样.但是,如果这不是类内初始化,我们将能够使用括号而不是大括号,并获得所需的结果:
std::vector<int> v(3); // vector of three zeros
Run Code Online (Sandbox Code Playgroud)
但是,由于最令人烦恼的解析,我们不能在课堂上这样做:
struct Foo{
std::vector<int> v(3); // most vexing parse; doesn't compile
};
Run Code Online (Sandbox Code Playgroud)
当然,上面的代码是否是良好的设计实践是有争议的,因为我们可以轻松地将我们想要做的事情移动到构造函数中.但暂时把它放在一边,有没有办法执行所需的初始化,尽可能接近第一个std::string例子,这没有问题?
我正在进行 rusttles 练习,并注意到 rust-analyzer 已打开,但没有生成任何内联错误消息或类型提示。基本上什么都不做。
我认为这是因为我没有打开其中有 Cargo.toml 的顶级 rusdlings 目录,所以我关闭了 VSCode,然后在 VSCode 中打开该目录作为我的工作区,并确保工作区设置为“受信任” 。尽管如此,锈迹分析仪仍然没有任何结果。
相比之下,我使用创建了自己的货物包cargo new,然后在 VSCode 中打开它,并且 rust-analyzer 工作正常,有错误和类型提示等等。
为什么 rust-analyzer 不适用于 rusdlings 工作区?
VSCode 1.74.3 Debian 11 Rustlings 于 2023 年 1 月克隆
据我了解,在 C++ 中,std::vector::resize当新大小较小时不分配新内存。此外,如果元素类型是具有析构函数的用户定义类,则可以为调整大小中“丢失”的每个元素调用该析构函数,因此在这种情况下,运行时间将与大小差异呈线性关系。
但是,如果元素类型是原语,例如std::vector<int>,则无需调用析构函数。在这种情况下,是否有任何理由认为resize向下不会是 O(1) 时间?
我有以下模板元编程实现的阶乘:
#include <iostream>
template <int n> struct factorial{
static const int res = n*factorial<n-1>::res;
};
template <> struct factorial<0>{
static const int res = 1;
};
int main(){
std::cout << factorial<5>::res << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,此代码成功编译并输出120.但是,出于纯粹自我享受的原因,我想改为使其不编译,而是在编译器的错误消息中显示120.
是否有一个简单的语法错误我可以刻意进入我的代码,使其无法编译,但仍然在编译器错误消息中打印5 !,即120的值?
我预计答案可能依赖于编译器; 我目前正在使用Xcode Mac OSX附带的g ++,其中iirc是clang的前端.
c++ compiler-errors static-variables template-meta-programming
2021 年 1 月的更新:我在2021 年 1 月执行了 Big Sur 的全新安装,并使用 将 pip 升级到最新版本python3 -m pip install --upgrade pip --user,并且安装numpy没有问题,并且没有下面的错误消息。
2020 年 11 月的原始问题
我在 2019 macbook pro 上使用 macOS big sur。我可以使用python3 -m pip install numpy --user. 注意我没有brew; 我只是使用 Xcode 命令行工具中的 python3。我在许多其他地方看到过这个错误报告,但他们似乎都使用 brew。
但是,当我尝试时import numpy as np,我收到以下错误消息。
Python(488,0x11700be00) malloc: can't allocate region
:*** mach_vm_map(size=18446744071565352960, flags: 100) failed (error code=3)
Python(488,0x11700be00) malloc: *** set a breakpoint in malloc_error_break to …Run Code Online (Sandbox Code Playgroud) (注意原来的问题标题有“而不是右值”而不是“而不是常量引用”。下面的答案之一是对旧标题的回应。为了清楚起见,这是固定的)
C 和 C++ 中的一种常见构造是用于链式赋值,例如
int j, k;
j = k = 1;
Run Code Online (Sandbox Code Playgroud)
第二=首先进行,用该表达k=1具有副作用k被设置为1,而表达式本身的值是1。
但是,在 C++ 中合法(但在 C 中不合法)的一种构造如下,它对所有基本类型都有效:
int j, k=2;
(j=k) = 1;
Run Code Online (Sandbox Code Playgroud)
在这里,表达式j=k具有设置j为 2的副作用,并且表达式本身成为对 的引用j,然后将其设置j为 1。据我所知,这是因为表达式j=k返回非- const int&,例如一般来说是左值。
通常也建议将此约定用于用户定义的类型,如Meyers Effective C++中的“Item 10: Have assignment operators return a (non-const) reference to *this”中所述。本书的这一部分并没有试图解释为什么参考文献是非引用的const,甚至没有注意到const顺便提及的非引用性。
当然,这当然增加了功能,但(j=k) = 1;至少可以说这种说法似乎很尴尬。
如果约定改为使用内置赋值返回const引用,那么自定义类也将使用此约定,并且 C 中允许的原始链式构造仍然有效,无需任何无关的副本或移动。例如,以下正确运行:
#include …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算HHHHHHTTTTTT100万次翻转中字符串的出现次数.对于硬币翻转,我使用的是一个简单的std :: rand()%2.下面的代码.在数学上,预期的答案是
(10 ^ 6 - 12 + 1)/ 2 ^ 12 = 244
我从概率教科书中得到了这个结果.但是我的代码一直只有大约一半,即大约122.这是使用std :: rand()作为硬币翻转算法的问题,还是我的代码中有错误?
#include <iostream>
#include <cstdlib>
#include <vector>
#include <ctime>
using std::vector;
bool coin_flip(){
return std::rand() % 2;
}
int count_string(int n, const vector<bool>& s){
int k=0, res=0;
for(int i=0; i<n; i++){
if(coin_flip()==s[k]){
k++;
if(k==s.size()){
res++;
k=0;
}
}else{
k=0;
}
}
return res;
}
int main(){
std::srand(std::time(0));
vector<bool> v(12);
const int a[12] = {1,1,1,1,1,1,0,0,0,0,0,0};
for(int i=0; i<12; i++){
v[i] = a[i]; …Run Code Online (Sandbox Code Playgroud) c++ ×7
c++11 ×2
constructor ×2
python ×2
ipython ×1
lvalue ×1
macos ×1
numpy ×1
overloading ×1
random ×1
return-type ×1
rust ×1
rvalue ×1
stdvector ×1
stl ×1