小编c z*_*c z的帖子

在c#中散列数组

简短的问题

如何实现GetHashCode一个Array.

细节

我有一个覆盖的对象Equals,检查:

this.array[n] == otherObject.array[n]
Run Code Online (Sandbox Code Playgroud)

所有narray.

当然,我应该实施补充GetHashCode.我想知道是否有.NET方法可以做到这一点,或者我是否应该实现自己的方式

hash = hash ^ array[n]
Run Code Online (Sandbox Code Playgroud)

澄清

我的对象包含一个数组,我对GetHashCode感兴趣的数组元素.我的数组等价代码仅作为示例 - 就像我的问题所说,但也许我不清楚,我对GetHashCode(不是Equals)感兴趣.我说我自然应该实现补充,GetHashCode因为一旦Equals被覆盖(为了Dictionary正常运行等),实现这一点是.NET的要求.谢谢.

.net c# arrays hash

15
推荐指数
1
解决办法
6344
查看次数

如何为List工作?

我想了解Python的类型注释如何工作(如ListDict- listdict).具体来说,我对如何isinstance(list(), List)工作感兴趣,以便我可以创建自己的自定义注释.

我看到它List被定义为:

class List(list, MutableSequence[T], extra=list):
    . . .
Run Code Online (Sandbox Code Playgroud)

我很熟悉,metaclass = xxx但我找不到任何关于此的文档extra = xxx.这是一个关键字还是一个参数,如果是这样的话,它来自哪里,它会做我想要的事情?它甚至相关isinstance吗?

python metaclass type-hinting isinstance python-3.x

11
推荐指数
1
解决办法
1048
查看次数

通过基类函数指针调用派生类

我可以通过基类函数指针调用派生类,如下例所示?

我理解我的示例有效,但保证总是这样做(假设对象实际上实现了函数!),或者这只是我正在使用的编译器的特性?

通过这个逻辑,不能简单地从"CBase"(在这种情况下是空的,所以我猜没有开销)派生所有类,并忽略函数指针中的类型?

#include <iostream>

struct CBase
{ 
};

struct CDerived : CBase
{
    void MyFunction()
    {
        std::cout << "Called OK" << std::endl;
    }
};

typedef void (CBase::*FunctionPointer)();


int main()
{
    CDerived* base = new CDerived();

    FunctionPointer pointer = static_cast<FunctionPointer>(&CDerived::MyFunction);
    (base->*pointer)();

    delete base;
}
Run Code Online (Sandbox Code Playgroud)

示例用法场景:一个派生类,它在基类中带有一个或多个指向"回调"的指针.可以使用派生类来定义回调类型,从而放弃对模板的需求吗?

c++ polymorphism member-function-pointers

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

Python——迭代一个迭代器两次

编辑:这里有一个类似的问题涉及迭代器重置。然而,下面接受的答案解决了嵌套迭代器的实际问题,并处理了一个容易错过的问题,即嵌套迭代器不会重置。

有没有办法在 python 中迭代迭代器两次?

在下面的示例代码中,我可以看到第二次迭代与第一次迭代在同一对象上运行,因此产生了奇怪的结果。将此与下面的 C# 进行对比,得到我想要的结果。

有什么办法可以做我想做的事。我想知道是否可以复制迭代器或“检索”它来自的函数,但也许有一种更简单的方法。(我知道我可以在下面的玩具示例中调用MyIter()两次,但如果我不知道迭代器来自哪里并且不是我想要的,那么这是没有用的!)。

def MyIter():
  yield 1;
  yield 2;
  yield 3;
  yield 4;

def PrintCombos(x):
  for a in x:
      for b in x:
          print(a,"-",b);

PrintCombos(MyIter());
Run Code Online (Sandbox Code Playgroud)

给出

1 - 2
1 - 3
1 - 4
Run Code Online (Sandbox Code Playgroud)

对比:

static IEnumerable MyIter()
{
    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;
}

static void PrintCombos(IEnumerable x)
{
    foreach (var a in x)
        foreach (var b in x)
            Console.WriteLine(a + "-" …
Run Code Online (Sandbox Code Playgroud)

python iterator for-loop yield generator

7
推荐指数
1
解决办法
5160
查看次数

信号处理程序可以在PyQt中泄漏内存吗?

简短问题:

可以通知处理程序内存泄漏。

长问题:

在C#中,如果我将处理程序附加到事件

left_object.left_event += right_object.right_handler
Run Code Online (Sandbox Code Playgroud)

然后,我需要删除处理程序,right_object否则垃圾收集器将永远不会处理它(因为left_object.left_event保留了的指针right_object

PyQt信号和插槽也是如此。

left_object.left_signal.connect( right_object.right_handler )
Run Code Online (Sandbox Code Playgroud)

这个问题中,我看到Qt会在调用left_objector 的析构函数时自动解除信号和插槽的链接,right_object但是在Python中,我无法显式调用该析构函数,它right_handler是一个普通的函数。

我是否需要删除处理程序以防止right_objects的内存泄漏,还是PyQt使用某种弱引用?

python events qt pyqt signals-slots

7
推荐指数
1
解决办法
296
查看次数

`std :: unordered_map`没有复制关键数据

我有一个Person类,它有一个nameproperty(std::string).

我想创建一个查找表,一个std::unordered_map,所以我可以找到一个Person名字.但是,鉴于a Person,我也希望能够得到他们的名字.

这需要存储name两次 - 一次作为地图的键,一次存储在人物对象内,如下面的代码所示.

由于我有很多Persons一次加载到内存中,我不希望两次存储它们的名称的开销.

我已经尝试在Person类中使用键的引用/指针,但这会产生问题,因为映射似乎在修改时重新调整其数据,并且引用变为无效.

我也尝试过使用std::unordered_set,但这意味着我Person每次想要执行查找时都需要构造一个完整的对象.

是否有任何方法可以使无序映射的键和值共享相同的数据?

#include <iostream>
#include <unordered_map>


class Person
{
    private:
        const std::string _name;

    public:
        Person( const std::string& name ) : _name( name )
        {
        }


        const std::string& get_name() const
        {
            return _name;
        }
};


int main()
{
    auto my_set = std::unordered_map<std::string, std::shared_ptr<Person>>();

    my_set.insert( { "alice", std::shared_ptr<Person>( new Person( "alice" )) } …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map stdmap c++11

7
推荐指数
1
解决办法
658
查看次数

Python Pickle 调用构造函数

我想使用 Python 的 pickle 序列化器为缺失值提供默认值。由于类很简单,默认值自然存在于类的__init__方法中。

我可以从泡菜文档中看到有__getnewargs__. 但是,这仅适用于__getnewargs__“酸洗”之前存在的情况。

有什么方法可以告诉 python pickle 始终调用构造函数而不是从未初始化的对象开始?

python constructor pickle jsonpickle python-3.x

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

reinterpret_cast 和结构对齐

是否有任何安全的方法可以将整数转换为结构?

举个例子:

struct Colour
{
    uint8_t A;
    uint8_t R;
    uint8_t G;
    uint8_t B;
};
Run Code Online (Sandbox Code Playgroud)

我转换为整数或从整数转换:

uint32_t myInteger
Colour* myColour = reinterpret_cast<Colour*>(&myInteger);
uint32_t* myInteger2 = reinterpret_cast<uint32_t*>(myColour);
Run Code Online (Sandbox Code Playgroud)

如果我的结构被填充,那么这将不起作用,有什么方法可以保证它有效吗?

我知道这可能不是标准的,但我更喜欢支持主要编译器(Visual Studio 和 GCC)而不是一些位移解决方法,这里已经回答了:Type cast struct to integer c++

c++ memory-alignment reinterpret-cast

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

通过向 stdin 发送 ctrl-c 来向进程发送 SIGINT

我正在寻找一种模仿终端进行一些自动化测试的方法:即启动一个进程,然后通过将数据发送到标准输入并从标准输出读取来与其交互。例如,将一些输入行发送到标准输入,包括ctrl-c和 ,ctrl-\这将导致向进程发送信号。

使用std::process::Commannd我能够将输入发送到eg cat,并且我还在stdout上看到它的输出,但是发送ctrl-c(据我所知3)不会导致SIGINT发送到shell。例如这个程序应该终止:

use std::process::{Command, Stdio};
use std::io::Write;

fn main() {
    let mut child = Command::new("sh")
        .arg("-c").arg("-i").arg("cat")
        .stdin(Stdio::piped())
        .spawn().unwrap();
    let mut stdin = child.stdin.take().unwrap();
    stdin.write(&[3]).expect("cannot send ctrl-c");
    child.wait();
}
Run Code Online (Sandbox Code Playgroud)

我怀疑问题是发送ctrl-c需要一些 tty 并且通过sh -i它仅处于“交互模式”。

我是否需要成熟并使用例如termionncurses

更新:我在原来的问题中混淆了 shell 和终端。我现在把这事弄清楚了。我还提到了ssh应该是的sh

unix signals process pty rust

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

Python。从多个异常中引发异常

我可以引发from另一个异常以提供附加信息,例如:

try:
    age = int(x)
except Exception as ex:
    raise ValueError("{} is not a valid age.".format(x)) from ex
Run Code Online (Sandbox Code Playgroud)

有没有办法从多个异常中获取来源?例如

try:
    age = int(x)
except Exception as ex1:
    try:
        age = date_now().year - parse_date(x).year
    except Exception as ex2:
        raise ValueError("{} is not a valid age or date.".format(x)) from ex1 + ex2
Run Code Online (Sandbox Code Playgroud)

python error-handling exception raise python-3.x

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