小编use*_*954的帖子

C ++-使用const引用来延长临时成员,确定成员或UB成员?

考虑这样的事情:

#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)

c++ temporary lifetime language-lawyer reference-binding

37
推荐指数
1
解决办法
1072
查看次数

pyplot - 复制轴内容并以新图形显示

假设我有这个代码:

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等...)但我觉得必须有一个更好的方法来做到这一点

谢谢

matplotlib

18
推荐指数
1
解决办法
6304
查看次数

numpy memmap 内存使用 - 想要迭代一次

假设我在磁盘上保存了一些大矩阵。将它全部存储在内存中并不是真的可行,所以我使用 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() 不保留对其接收的数组的任何引用,因此在该方面没有“内存泄漏”

谢谢

python numpy numpy-memmap

5
推荐指数
2
解决办法
2557
查看次数

重载 const 函数并使用 -pedantic 进行编译时出现奇怪的编译失败

下面的代码无法编译。
\n如果我删除bool foo(bool)重载,则a.foo(&b);调用将编译。
\n如果我const从中删除限定符,bool foo(bool*) const;a.foo(&b);调用将编译。
\n在写问题时我发现,如果没有-pedanticgcc,它也可以编译
\n我不明白为什么......

\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

和编译错误:

\n
error: 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)

c++

5
推荐指数
1
解决办法
46
查看次数

C ++ 11将std函数绑定到重载的静态方法

这个问题对我来说似乎有点愚蠢,但我找不到任何类似的问题,对不起,这很琐碎

假设我们有一个结构:

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吗?我想念什么?

谢谢

c++11 std-function

4
推荐指数
1
解决办法
772
查看次数

是否应该longjmp恢复堆栈?

据我了解,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 c++ longjmp setjmp

2
推荐指数
1
解决办法
108
查看次数