考虑这样的事情:
#include <iostream>
struct C {
C(double x=0, double y=0): x(x) , y(y) {
std::cout << "C ctor " << x << " " <<y << " " << "\n";
}
double x, y;
};
struct B {
B(double x=0, double y=0): x(x), y(y) {}
double x, y;
};
struct A {
B b[12];
A() {
b[2] = B(2.5, 14);
b[4] = B(56.32,11.99);
}
};
int main() {
const B& b = A().b[4];
C c(b.x, b.y);
}
Run Code Online (Sandbox Code Playgroud)
当我用-O0编译时,我得到了打印
C ctor …
Run Code Online (Sandbox Code Playgroud) 假设我有这个代码:
num_rows = 10
num_cols = 1
fig, axs = plt.subplots(num_rows, num_cols, sharex=True)
for i in xrange(num_rows):
ax = axs[i]
ax.plot(np.arange(10), np.arange(10)**i)
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果图有太多信息,现在我想选择1个轴并在新图中单独绘制它
我尝试过做这样的事情
def on_click(event):
axes = event.inaxes.get_axes()
fig2 = plt.figure(15)
fig2.axes.append(axes)
fig2.show()
fig.canvas.mpl_connect('button_press_event', on_click)
Run Code Online (Sandbox Code Playgroud)
但它没有奏效.这样做的正确方法是什么?搜索文档并抛出SE几乎没有任何有用的结果
编辑:
我不介意重新绘制所选择的轴,但我不知道如何判断哪个轴被选中,所以如果该信息以某种方式可用,那么它对我来说是一个有效的解决方案
编辑#2:
所以我设法做了这样的事情:
def on_click(event):
fig2 = plt.figure(15)
fig2.clf()
for line in event.inaxes.axes.get_lines():
xydata = line.get_xydata()
plt.plot(xydata[:, 0], xydata[:, 1])
fig2.show()
Run Code Online (Sandbox Code Playgroud)
这似乎是"工作"(所有其他信息丢失 - 标签,线条颜色,线条样式,线条宽度,xlim,ylim等...)但我觉得必须有一个更好的方法来做到这一点
谢谢
假设我在磁盘上保存了一些大矩阵。将它全部存储在内存中并不是真的可行,所以我使用 memmap 来访问它
A = np.memmap(filename, dtype='float32', mode='r', shape=(3000000,162))
Run Code Online (Sandbox Code Playgroud)
现在假设我想遍历这个矩阵(本质上不是以有序的方式),这样每一行都将被访问一次。
p = some_permutation_of_0_to_2999999()
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
start = 0
end = 3000000
num_rows_to_load_at_once = some_size_that_will_fit_in_memory()
while start < end:
indices_to_access = p[start:start+num_rows_to_load_at_once]
do_stuff_with(A[indices_to_access, :])
start = min(end, start+num_rows_to_load_at_once)
Run Code Online (Sandbox Code Playgroud)
随着这个过程在我的电脑上进行,我的电脑变得越来越慢,我的 RAM 和虚拟内存使用量呈爆炸式增长。
有没有办法强制 np.memmap 使用一定数量的内存?(我知道我需要的行数不会超过我计划一次读取的行数,而且缓存不会真正帮助我,因为我只访问了每一行一次)
也许有其他方法可以按自定义顺序在 np 数组上迭代(类似于生成器)?我可以使用 file.seek 手动编写它,但它恰好比 np.memmap 实现慢得多
do_stuff_with() 不保留对其接收的数组的任何引用,因此在该方面没有“内存泄漏”
谢谢
下面的代码无法编译。
\n如果我删除bool foo(bool)
重载,则a.foo(&b);
调用将编译。
\n如果我const
从中删除限定符,bool foo(bool*) const;
则a.foo(&b);
调用将编译。
\n在写问题时我发现,如果没有-pedantic
gcc,它也可以编译
\n我不明白为什么......
struct A { \n\n bool foo(bool){\n return true;\n }\n bool foo(bool*) const {\n return false;\n }\n\n};\n\n\nint main() {\n A a;\n a.foo(true);\n bool b;\n a.foo(b);\n a.foo(&b); // does not compile\n const_cast<const A&>(a).foo(&b); // does compile\n}\n
Run Code Online (Sandbox Code Playgroud)\n和编译错误:
\nerror: call of overloaded \xe2\x80\x98foo(bool*)\xe2\x80\x99 is ambiguous\n a.foo(&b);\n ^\n/tmp/asdasd.cpp:4:8: note: candidate: bool A::foo(bool)\n bool foo(bool){\n ^~~\n/tmp/asdasd.cpp:7:8: note: candidate: bool A::foo(bool*) const\n bool …
Run Code Online (Sandbox Code Playgroud) 这个问题对我来说似乎有点愚蠢,但我找不到任何类似的问题,对不起,这很琐碎
假设我们有一个结构:
struct C {
static void f(int i) { std::cerr << (i + 15) << "\n"; }
static void f(std::string s) { std::cerr << (s + "15") << "\n"; }
};
Run Code Online (Sandbox Code Playgroud)
现在在其他地方:
std::function<void(int)> f1 = C::f; // this does not compile
void (*f2)(std::string s) = C::f; // this compiles just fine
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
错误:请求从“”转换为非标量类型“ std :: function”
在这种情况下有什么方法可以使用std :: function吗?我想念什么?
谢谢
据我了解,setjmp
保存当前上下文,并且应该在调用时还原它longjmp
。但是,下一段代码将显示15(我使用-g编译,没有进行任何优化)。我是不是误解了这种结构,还是想念其他东西?
#include <iostream>
#include <csetjmp>
std::jmp_buf jump_buffer;
int main()
{
int a = 0;
if (setjmp(jump_buffer) == 0) {
a = 15;
std::longjmp(jump_buffer, 42);
}
std::cerr << a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
免责声明:仅出于好奇而尝试使用它。直到最近我阅读了一些有关NASA编码准则的论文,并提到禁止使用这种控制结构流程之后,我才听说过这种结构。
因为代码是混合的,所以同时使用c和c ++标记,并且我认为实际的相关功能与c重度用户更相关,而不是c ++ ...:/
c++ ×3
c ×1
c++11 ×1
lifetime ×1
longjmp ×1
matplotlib ×1
numpy ×1
numpy-memmap ×1
python ×1
setjmp ×1
std-function ×1
temporary ×1