小编Dri*_*ise的帖子

正在访问指针元组和互斥锁线程安全的元组

鉴于std::tuple,

using Tuple1 = std::tuple<Foo1*, Bar1*, std::shared_ptr<std::mutex>>;
using Tuple2 = std::tuple<Foo2*, Bar2*, std::shared_ptr<std::mutex>>;
std::tuple<Tuple1, Tuple2> tuple;
Run Code Online (Sandbox Code Playgroud)

而功能,

void baz()
{
    auto tup = std::get<0>(tuple);

    std::lock_guard<std::mutex> lk(*std::get<2>(tup));

    // Do something with std::get<0>(tup) and std::get<1>(tup)
}
Run Code Online (Sandbox Code Playgroud)

根据这个关于SO的问题,访问a std::tuple本身并不是线程安全的,但是在示例代码的情况下呢?是否有可能发生未定义/奇怪的事情?

这是假设FooN&BarN只能在锁定后访问.

c++ concurrency multithreading tuples stdtuple

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

在新窗口中显示绘图而不是内联(未通过之前的帖子回答)

一些现有的帖子解决了这个问题,但没有一个解决方案适合我.

我在Python 3.6中使用Spyder 3.2.4.我想在新窗口中显示情节,而不是在IPython控制台中显示为微小的内联数字.

我尝试了工具>首选项> IPython控制台>图形>图形后端>自动.我也在这里尝试过Qt5和Qt4,并关闭并重新打开我试图运行的文件(参见下面的代码).

我也试过了

 matplotlib qt 
Run Code Online (Sandbox Code Playgroud)

直接在控制台中,没有结果.

我检查了窗口是否可能在后台弹出,但它们不是.

有任何想法吗?

码:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x**2

plt.ion()   
plt.plot(x,y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

python plot interactive matplotlib spyder

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

如何避免使用命名空间std; 在C++中

我在尝试将我的C++源代码从HP-UX移植到Linux时遇到了这个问题.当我尝试在Linux上编译C++源代码时,会发生的是它抱怨组件(来自标准C++库)不存在.使用命名空间std放置行; 在源代码的顶部似乎解决了这个问题.当我尝试在HP-UX上重新编译代码时,aCC编译器抱怨这里只有名称空间名称有效(它不认为std是有效的名称空间).我想知道是否有办法解决这个问题,以便源代码与HP-UX长期弃用的C++编译器和LINUX的GCC编译器二进制兼容.

c++ linux gcc hp-ux

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

Qt Widget - 如何捕获几个键盘键

我知道使用grabKeyboard()我的小部件能够抓住每个键盘事件,如果它没有聚焦,但如果我只想捕获三个或四个键怎么办?

我尝试使用事件过滤器 http://doc.trolltech.com/3.3/qobject.html#installEventFilter

但这没用(也许是因为我这样安装了?)

 class MyWidget: public QGLWidget
    {
        ...
    protected:
        bool eventFilter( QObject *o, QEvent *e );
    };

    bool MyWidget::eventFilter( QObject *o, QEvent *e )
    {
        if ( e->type() == QEvent::KeyPress ) {
            // special processing for key press
            QKeyEvent *k = (QKeyEvent *)e;
            qDebug( "Ate key press %d", k->key() );
            return TRUE; // eat event
        } else {
            // standard event processing
            return FALSE;
        }
    }

// Installed it in the constructor
MyWidget::MyWidget()
{
    this->installEventFilter(this);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能拦截我的小部件中的几个键,并留下其他小部件(QTextEdits)?

c++ keyboard qt4

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

在 G++ 中使用 -frepo 选项

我的工作地点是为一些没有虚拟内存的绝对古老的硬件开发代码。正因为如此,我们会尽量减少对象和二进制文件的文本大小,以免内存不足。这可能意味着我们需要限制使用来自 STL 的模板,或者完全禁止它们。在环顾四周寻找最小化文件大小并仍然使用模板的方法时,我遇到了-frepog++的选项。几次测试后,我比开始时更加困惑。使用 -frepo 时,最终的二进制文件大小相同或更大,这对我来说没有意义。任何人都可以向我解释这个选项实际上做了什么(除了“它只是有效”,因为这是 GCC 4.7.1 手册中的解释)以及我可能如何滥用它?

编译g++ -c -frepo main.cpp test8.cpp和链接 正在g++ test8.o main.o 创建 .rpo 文件。

测试8.h:

#include <list>
using namespace std;

class Test
{
  public:
    Test ();
    list<int> makeNewIntList ();
  private:
  list<int> intList;
};
Run Code Online (Sandbox Code Playgroud)

测试8.cpp:

#include "test8.h"
#include <list>

using namespace std;

Test::Test()
{
  intList = list<int>( 10, 12 );
}

list<int> Test::makeNewIntList()
{
  intList.push_back(4);
  return intList;
}
Run Code Online (Sandbox Code Playgroud)

主程序

#include "test8.h"

using namespace std;

void findFive (int num);
list<int> makeIntList();

int …
Run Code Online (Sandbox Code Playgroud)

c++ templates g++

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

QTreeWidget editItem失败,出现"编辑:编辑失败"

QTreeWidgetItem添加了一个QTreeWidget:

QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs);
item->setFlags(item->flags() | Qt::ItemIsEditable);
Run Code Online (Sandbox Code Playgroud)

如果项目已编辑,我想对新值进行一些检查:

Pairs::Pairs(QWidget *parent) :
QWidget(parent),
  ui(new Ui::Pairs)
{
  ui->setupUi(this);
  connect(this->ui->trwPairs, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(Validate(QTreeWidgetItem*,int)));
}

void Pairs::Validate(QTreeWidgetItem* item, int column)
{
  if (item->text(column).toInt() < 1)
  {
    QMessageBox::critical(this, "Error", QString("Node ID ") + item->text(column) +  " is invalid.");
    ui->trwPairs->editItem(item, column);
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果它小于1,它会捕获它,并给我消息框.但是,打印到cerris edit: editing failed并且项目不处于编辑模式.我错过了什么?

c++ qt qtreewidget qwidget

4
推荐指数
2
解决办法
6109
查看次数

重置系列索引而不转换为 DataFrame

当我使用Series.reset_index()我的变量时,它变成了一个DataFrame对象。有没有办法重置系列的索引而不会导致此结果?

上下文是基于概率的随机选择模拟(蒙特卡罗模拟),其中从系列中进行的选择被省略series.pop(item)

我需要重置索引,因为我会进行迭代以创建累积频率系列。

python simulation montecarlo pandas

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

std::map 分配是否尽可能静态?

考虑具有相同效果的 3 个版本的代码:

版本1:

int main()  {
    std::map<int,int> x = {{0,0}, {1,1}, {2,2}};
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版本2:

int main()  {
    std::map<int,int> x;
    x[0] = 0;
    x[1] = 1;
    x[2] = 2;
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版本3:

int main()  {
    std::map<int,int> x;
    x.insert(std::pair<int,int>(0,0));
    x.insert(std::pair<int,int>(1,1));
    x.insert(std::pair<int,int>(2,2));
    // Do some stuff...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这些代码的效率是多少?

我认为版本 1 是完全静态分配:x分配一次所需的空间并设置值。我还认为版本 3 需要动态分配:每次调用 insert 都会检查该键是否尚未使用,检查插入位置并在分配值之前分配更多空间来映射。对于版本 2,我不确定。你能帮我吗?

c++ memory-management dynamic-memory-allocation

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

数学运算符差异 *= 或 +=

当我使用运算符例如*=或时,我发现了一件奇怪的事情+=

代码:

aa = Variable(torch.FloatTensor([[1,2],[3,4]]))
bb = aa
bb = bb*2
print(bb)
print(aa)

cc = Variable(torch.FloatTensor([[1,2],[3,4]]))
dd = cc
dd *= 2
print(cc)
print(dd)
Run Code Online (Sandbox Code Playgroud)

结果如下:

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]

Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,当我使用时bb=bb*2aa没有受到影响。但是,如果使用dd *= 2,cc似乎指向(共享)与 相同的地址 …

python pytorch

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

合并日期和时间;ValueError:小时必须在 0..23 内

我有以下 df:

date                             time
2018-01-01 00:00:00             7:30:33
2017-01-01 00:00:00             7:30:33
Run Code Online (Sandbox Code Playgroud)

我想创建一个日期时间列,应如下所示:

2018-01-01 7:30:33        
2017-01-01 7:30:33  
Run Code Online (Sandbox Code Playgroud)

为此,我使用以下代码:

    df["datetime"] = pd.to_datetime(df['date'].apply(str)+' '+df['time'])
Run Code Online (Sandbox Code Playgroud)

它在大多数时间都有效。但是,在我的 df 的某些部分(我不知道是哪些部分),我收到以下错误:

ValueError: hour must be in 0..23
Run Code Online (Sandbox Code Playgroud)

我做错了什么以及如何解决这个问题?

python datetime pandas

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