小编Kyl*_*and的帖子

从另一个哈希中的相应值中减去哈希值

我希望能够减去两个哈希并在Ruby中获得第三个哈希值.

这两个哈希看起来像这样:

h1 = {"Cat" => 100, "Dog" => 5, "Bird" => 2, "Snake" => 10}
h1.default = 0

h2 = {"cat" => 50, "dog" => 3, "BIRD" => 4, "Mouse" => 75, "Snake" => 10}
h2.default = 0
Run Code Online (Sandbox Code Playgroud)

我想能够像这样在h1上调用一个方法:

h1.difference(h2)
Run Code Online (Sandbox Code Playgroud)

并获得此哈希作为结果:

{"Cat" => 50, "Dog" => 2, "BIRD" => -2, "Mouse" => -75}
Run Code Online (Sandbox Code Playgroud)

我想创建一个新哈希,其中包含来自两个哈希的键和新哈希的值,它们是第一个哈希中键的值减去第二个哈希中该键的值.问题是,无论密钥的情况如何,我都希望这种Hash方法能够正常工作.换句话说,我希望"猫"与"猫"相匹配.

这是我到目前为止所拥有的:

class Hash
  def difference(another_hash)
    (keys + another_hash.keys).map { |key| key.strip }.uniq.inject(Hash.new(0)) { |acc, key| acc[key] = (self[key] - another_hash[key]); acc }.delete_if { |key, value| …
Run Code Online (Sandbox Code Playgroud)

ruby hash

6
推荐指数
1
解决办法
4214
查看次数

自动生成的移动构造函数导致非法行为

我问了一个关于移动构造函数的问题,我尚未接受答案,因为即使我开始掌握其他问题,我对问题的某些方面感到更加困惑.特别是,我发现了一个令人惊讶的案例,其中g ++和clang ++都生成了错误的移动构造函数.

问题摘要

  • g ++和clang ++显然违反了在明确定义析构函数时不生成move-constructors的规则; 为什么?这是一个错误,还是我误解了发生了什么?
  • 为了正确,这些(可能是非法的)移动构造函数应该使RHS指针成员无效,但它们不会.为什么不?
  • 似乎避免不需要的行为的唯一方法是为在析构函数中使用的每个类显式定义一个正确的移动构造delete函数.Qt库(版本5.4)是否这样做?

第1部分:非法自动生成的构造函数?

请考虑以下代码:

class NoMove
{
  public:
    ~NoMove() {}
};
int main()
{
  std::cout << "NoMove move-constructible? " <<
    std::is_move_constructible<NoMove>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

使用g++4.9.2和clang++3.5.1 编译,此代码打印:

NoMove move-constructible? 1
Run Code Online (Sandbox Code Playgroud)

...但是由于NoMove有一个明确定义的析构函数,我希望应该自动生成移动构造函数和复制构造函数.请注意,意外的构造函数生成不是因为析构函数是微不足道的; 当析构函数delete[]是一个数组(!!)时,我得到了相同的行为,我甚至能够编译需要有效移动构造函数的代码(!!!!!).(见下面的例子.)这里发生了什么?在这里自动生成移动构造函数是否合法,如果是,为什么?

第2部分:(可能是非法的)自动生成的构造函数导致未定义的行为?

看来,提供安全的移动构造函数时delete涉及相当简单,但我只是想确保我的理解:当一个类包含一个指向成员,拥有基本数据,有没有任何在它是不正确和案例在将目标指针设置为旧值后,移动构造函数是否足以使RHS指针无效?

请考虑以下示例,该NoMove示例与上面的示例类似,并基于我原来的问题:

class DataType
{
  public:
    DataType()
    {
      val …
Run Code Online (Sandbox Code Playgroud)

c++ qt pointers move-semantics c++11

6
推荐指数
1
解决办法
350
查看次数

何时以及如何默认初始化const变量?

clang++没有用户定义的构造函数,它不允许默认初始化类型的const变量 ; g++限制性稍差(见下文).根据这个答案,这是因为POD类型"默认情况下没有初始化".如果我理解正确,这意味着默认初始化不会调用默认构造函数,也不会调用值初始化,因此POD类型中的数据成员不会被初始化.当然,使用带有未初始化值的const POD类型是没有意义的,因为它们永远不会被初始化,因此使用起来不安全.

这种情况有一些变种:

  1. 该类型在技术上是"POD",但不包含数据成员(仅限函数).(clang++并不认为这是一种特殊情况,我认为也不是标准的,但g++也允许它,即使构造函数被标记explicit.)
  2. 使用定义空构造函数{}.(这是clang描述问题的页面上的推荐解决方法.)
  3. 声明了默认构造函数=default.(C++ 11以后;类型仍然被认为是POD,因此编译器和标准都不会将其视为特殊情况.)
  4. 使用显式调用聚合初始化{},(如果我理解正确)变为值初始化.(C++ 11以后;两个编译器 - 我认为,标准 - 允许这个.)

在第一种情况下,可能没有未初始化的成员,因此不清楚为什么任何类本身的实例化都将被视为"未初始化",而不管它是否是const.既然g++允许这种行为,使用安全吗?为什么禁止clang++和标准?(还有其他任何情况g++允许POD默认初始化哪里clang++没有?)

在第二和第三种情况下,使用{}代替的要求=default对我来说似乎很奇怪.编辑: 这个问题很好地解释了差异,所以我已经删除了询问区别的部分问题.(尽管如此,我仍然认为这是一种非常令人困惑的语言方面.)

最后,将Foo f{}始终是零初始化内置类型的成员如果Foo::Foo(void){},=default或隐式声明的?

c++ constructor default-constructor c++11

6
推荐指数
1
解决办法
239
查看次数

`using`声明用于用户定义的文字运算符

是否可以using为文字运算符声明operator ""

例如,

#include <chrono>

namespace MyNamespace
{
  constexpr std::chrono::hours operator "" _hr(unsigned long long n){
    return std::chrono::hours{n};
  }

  // ... other stuff in the namespace ...
}

using MyNamespace::operator"";    // DOES NOT COMPILE!

int main()
{
  auto foo = 37_hr;
}
Run Code Online (Sandbox Code Playgroud)

我的解决方法是将这些运算符放在它们自己的嵌套命名空间中literals,这允许using namespace MyNamespace::literals;,但这似乎有点不优雅,我不明白为什么using指令不能以operator相同的方式用于函数命名空间中的任何其他函数或类型.

c++ namespaces using operator-keyword user-defined-literals

6
推荐指数
1
解决办法
626
查看次数

检查是否在Bash中设置了陷阱

有没有办法检查trapBash中已设置的内容(在当前会话或脚本中)?

理想情况下,我希望能够获得trap分配给它们的信号列表,但如果不可能,我可以单独检查每个信号.

linux bash shell signals bash-trap

6
推荐指数
2
解决办法
1274
查看次数

使用matplotlib同时绘制两个函数

基本上我想绘制两个函数

g1 = x*cos(x*pi)
g2 = 1 - 0.6x^2
Run Code Online (Sandbox Code Playgroud)

然后绘制交点,我已经有一个模块接收两条线交叉点附近的输入,然后收敛到那些点(其中有四个)

但是我想用matplotlib来绘制这两个函数及其交叉点,但不知道如何.我只绘制了基本功能.任何帮助是极大的赞赏

python matplotlib

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

创建函数别名

编辑:这个问题最初的标题是“使用std::bind创建内联函数”,但这并不是我真正想要的:我只是想要一个简单的方法来别名函数。

我想std::chrono::high_resolution_clock::now作为一个独立的函数公开。也就是说,我想做以下事情:

auto current_time = std::bind(std::chrono::high_resolution_clock::now);
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于这是在一个头文件中,它会导致current_time链接时的多个定义。有没有一种方法返回一个内联函数std::bind

c++ inline stdbind c++11

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

使用一个数字数据成员为类定义所有比较运算符的便捷方法?

如果我有一个由单个数字数据成员(例如,一个int)和各种方法组成的类型,是否有一种方便的方法来告诉编译器自动生成所有明显的比较运算符?

即,而不是这个(当然使用inline而不是constexprC++ 03):

class MyValueType
{
    private:
        int myvalue;
    public:
        constexpr bool operator<(MyValueType rhs) const { return myvalue < rhs.myvalue; }
        constexpr bool operator>(MyValueType rhs) const { return myvalue > rhs.myvalue; }
        constexpr bool operator>=(MyValueType rhs) const { return myvalue >= rhs.myvalue; }
        constexpr bool operator==(MyValueType rhs) const { return myvalue == rhs.myvalue; }
        /// .... etc
}
Run Code Online (Sandbox Code Playgroud)

我想要像Ruby的Comparable mixin这样的东西,它基本上允许你定义一个操作符,让Ruby来处理其余的操作.我甚至认为编译器生成的版本可能比我的更好:应该rhsconst每个案例的参考?我应该定义转发引用的版本吗?如果我忘了其中一个操作员怎么办?等等.

所以...这样的事情存在吗?

(请原谅我,如果这是重复的;我认为有人会在某个地方问这个,因为它似乎是一个明显的功能,但我找不到任何东西.)

编辑:自动生成比较运算符已被提议作为一项功能:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3950.html

c++ comparison-operators c++11

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

使用可变参数模板创建类似元组的编译时"链表"

我正在思考可能的实现std::tuple(和任何类似的模板类,在编译时定义了可变数量的"成员"),我想也许可以创建一个类似于链表的"递归类型".我尝试编译以下测试用例:

template <typename FirstType, typename... OtherTypes>
class TupleLite
{
  public:
    FirstType type_;
    TupleLite<OtherTypes...> other_types_;
};

int main()
{
  TupleLite<int,double> mytuple;
}
Run Code Online (Sandbox Code Playgroud)

类本身编译时没有错误,但实例化会抛出错误wrong number of template arguments (0, should be 1 or more).我相信这是因为TupleLite<int, double>尝试实例化a TupleLite<double>,它试图实例化a TupleLite<>,没有有效的定义.

这个"递归大小的班级"可以被抢救吗?我尝试定义如下的"无争论专业化" TupleLite:

template <>
class TupleLite {}
Run Code Online (Sandbox Code Playgroud)

....但这似乎不起作用,虽然g++并且clang++似乎在确切原因上存在分歧.

从中g++,最相关的错误似乎是:

error: template specifiers not specified in declaration of ‘template<class FirstType, class ... OtherTypes> class TupleLite’
  class TupleLite
        ^
error: wrong number …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

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

带有多个“build.ninja”文件的“ninja”?

我想ninja同时启动多个构建。每个构建都在自己的目录中,并有自己的build.ninja文件。

我只能执行以下操作:

cd <build-dir-1>
ninja &
cd <build-dir-2>
ninja &
...
cd <build-dir-last>
ninja
Run Code Online (Sandbox Code Playgroud)

....但是这有几个问题:

  • 当同时启动多个独立构建时,Ninja 使用的默认线程数可能不是最佳的。
  • 我预计,输出将以一种不合理的方式交错。

编辑我也可以将ninja调用保留在前台(这是我目前正在做的事情),但是没有简单的方法来估计(整个)构建的当前进度。

因此,我想执行以下操作之一:

  1. build.ninja文件合并为一个大文件,可以在一次ninja调用中执行两种构建。
  2. 以某种方式启动ninja多个目标build.ninja脚本。

看起来不支持第二个选项ninja,但第一个似乎可以很容易地使用subninja <build-dir-n>/build.ninja. 有没有人做过这样的事情?有什么隐藏的陷阱吗?或者,我可以按顺序执行构建(即上面的顺序但没有&s),但这不是正确的解决方案。

用例

我正在使用CMake,它build.ninja为每个构建配置(发布和调试)生成一个单独的文件。我也针对多个平台,所以我有多个编译器,并且必须为每个平台单独运行 CMake。所以如果我想为所有平台构建发布调试代码,我需要运行多次。ninja

c++ build cmake ninja

5
推荐指数
0
解决办法
1185
查看次数