小编Alb*_*ert的帖子

unordered_map真的无序吗?

我对'unordered_map'这个名字感到很困惑.该名称表明钥匙根本没有订购.但我一直认为它们是按哈希值排序的.或者是错误的(因为这个名字意味着他们没有订购)?

或者说不同:是吗?

typedef map<K, V, HashComp<K> > HashMap;
Run Code Online (Sandbox Code Playgroud)

template<typename T>
struct HashComp {
    bool operator<(const T& v1, const T& v2) const {
        return hash<T>()(v1) < hash<T>()(v2);
    }
};
Run Code Online (Sandbox Code Playgroud)

同样的

typedef unordered_map<K, V> HashMap;
Run Code Online (Sandbox Code Playgroud)

?(好吧,不完全是,STL会在这里抱怨,因为可能有键k1,k2,k1 <k2和k2 <k1都没有.你需要使用multimap并覆盖等号检查.)

或者不同的是:当我遍历它们时,我可以假设密钥列表按其哈希值排序吗?

c++ unordered-map hashmap

13
推荐指数
2
解决办法
6347
查看次数

C++:错误"......不是从类型派生出来的......"

template<typename T1, typename T2>
class Bimap {
public:
    class Data;
    typedef Data* DataP;    
    typedef std::multimap<T1, DataP> T1Map;
    typedef std::multimap<T2, DataP> T2Map;

    class Data {
    private:
        Bimap& bimap;
        T1Map::iterator it1;
        /*...*/
    };
};
Run Code Online (Sandbox Code Playgroud)

这给了我这个编译错误:

error: type 'std::multimap<T1, Bimap<T1, T2>::Data*, std::less<_Key>, std::allocator<std::pair<const T1, Bimap<T1, T2>::Data*> > >' is not derived from type 'Bimap<T1, T2>::Data'

那是什么意思?这里有什么问题?

c++ compiler-errors

13
推荐指数
1
解决办法
6589
查看次数

在RPython中静态输入什么?

通常声称RPython(Python的一个子集)是静态类型的.(例如在维基百科上.)

最初,我想知道他们如何将它添加到Python并认为他们可能已经添加了添加语句的要求,例如assert isinstance(arg1, ...)在每个函数的开头(但我真的不相信).

然后我查看了一些RPython代码,它看起来并没有真正的静态类型.在许多情况下,可能是编译器可以证明函数参数只能是某些类型,但绝对不是在所有情况下.

例如,这是RPython的实现string.split:

def split(value, by, maxsplit=-1):
    bylen = len(by)
    if bylen == 0:
        raise ValueError("empty separator")

    res = []
    start = 0
    while maxsplit != 0:
        next = value.find(by, start)
        if next < 0:
            break
        res.append(value[start:next])
        start = next + bylen
        maxsplit -= 1   # NB. if it's already < 0, it stays < 0

    res.append(value[start:len(value)])
    return res
Run Code Online (Sandbox Code Playgroud)

在关于RPython的PyPy文档中,有人说:" 变量应该包含最多一种类型的值 ".

那么,函数参数也算作变量吗?或者在什么意义上RPython静态输入?或者这实际上是错误的?

python pypy static-typing rpython

13
推荐指数
1
解决办法
1574
查看次数

我应该保留随机分发对象实例还是可以随时重新创建它?

我有这个代码:

static std::mt19937 rnd;

// ...

static uint32_t rndInt(uint32_t min, uint32_t max) {
    return std::uniform_int_distribution<uint32_t>(min,max)(rnd);
}
Run Code Online (Sandbox Code Playgroud)

这是好的做法还是应该存储uniform_int_distribution

c++ random c++11

13
推荐指数
1
解决办法
701
查看次数

OrderedDict 和 dict 的键顺序是否相同?

dict自 Python 3.6 起保持插入顺序(请参阅)。

OrderedDict就是为了这个目的而开发的(Python 3.6之前)。

dict从 Python 3.6 开始, or的键顺序是否始终相同OrderedDict

我想知道我是否可以在我的代码中执行此操作并始终具有相同的行为(除了相等性以及 中的一些扩展方法OrderedDict)但更有效:

if sys.version_info[:2] >= (3, 6):
  OrderedDict = dict
else:
  from collections import OrderedDict 
Run Code Online (Sandbox Code Playgroud)

或者换句话说,对于 Python >=3.6,有什么理由使用OrderedDict

python

13
推荐指数
1
解决办法
1163
查看次数

Java:为什么它使用固定数量的内存?或者它如何管理记忆?

似乎JVM使用了一些固定数量的内存.至少我经常看到参数-Xmx(对于最大尺寸)和-Xms(对于初始尺寸)表明这一点.

我觉得Java应用程序不能很好地处理内存.我注意到的一些事情:

  • 甚至一些非常小的示例演示应用程序也会加载大量内存.也许这是因为加载了Java库.但为什么需要为每个Java实例加载库?(这似乎是因为多个小应用程序线性占用更多内存.请参阅此处了解我描述此问题的一些细节.)或者为什么这样做?

  • 像Eclipse这样的大型Java应用程序经常会因一些OutOfMemory异常而崩溃.这总是很奇怪,因为我的系统上仍然有足够的内存.通常,它们会在运行时消耗越来越多的内存.我不确定他们是否有一些内存泄漏,或者这是因为内存池中的碎片 - 我觉得后者就是这种情况.

  • 例如,Java库似乎需要比类似强大的库(如Qt)更多的内存.为什么是这样?(比较,启动一些Qt应用程序并查看它们的内存使用情况并启动一些Java应用程序.)

为什么它不仅仅使用基础系统技术mallocfree?或者如果他们不喜欢libc实现,他们可以使用jemalloc(就像在FreeBSD和Firefox中一样),这似乎相当不错.我很确定这会比JVM内存池表现更好.而且不仅表现更好,还需要更少的内存,尤其是 适用于小型应用.


另外:有人已经尝试过吗?我会对基于LLVM的Java JIT编译器感兴趣,它只使用malloc/ free进行内存处理.

或者这也可能与JVM实现和实现不同?我主要使用Sun JVM.

(另请注意:我不是直接在这里谈论GC.GC只负责计算可删除的对象并初始化内存释放但实际的释放是一个不同的子系统.Afaik,它是一些自己的内存池实施,而不仅仅是打电话free.)


编辑:一个非常相关的问题:为什么(Sun)JVM具有固定的内存使用上限?或者换句话说:为什么JVM处理内存分配的方式与本机应用程序不同?

java memory jvm memory-management

12
推荐指数
2
解决办法
5217
查看次数

C++中的函数与变量声明

此代码有效:

std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Run Code Online (Sandbox Code Playgroud)

因此mapFilenamestd::stringvoid ParseGameState(const std::string&);.

而这不是:

std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Run Code Online (Sandbox Code Playgroud)

这是错误:

game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
Run Code Online (Sandbox Code Playgroud)

所以它似乎s在这种情况下识别为函数声明而不是变量声明.

这是为什么?这是GCC 4.2.1(Apple版本)中的错误吗?或者GCC是否正确处理了这个问题?这在C++标准中是否未定义?

c++ variables declaration function

12
推荐指数
1
解决办法
1938
查看次数

Python:每个对象类型(或源代码行)的内存使用情况统计信息

我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我最终得到了大量的内存使用(> 1GB),所有参考都应该消失,我只有最终结果(不应该超过几MB).

为了调试这个,如果我能以某种方式得到一些统计信息,这将显示我有多少对象实例,它们是什么类型,按它们占用的内存总量(每个对象类)排序,这将是很好的.

或者甚至更好:不是每个对象类,而是每个创建对象的源代码行(我猜这个信息不可用,除非我在Python中激活一些调试会使计算太慢,所以我不确定是否会这样做很有帮助).

我能以某种方式获得这样的统计数据吗?或者我该如何调试?


有些人误解了我:我需要知道如何调试内存使用情况.处理/运行时间是完美的.

python memory debugging memory-leaks

12
推荐指数
2
解决办法
8779
查看次数

MacOSX:获得最重要的窗口标题

我正在使用此代码获取窗口标题:

tell application "System Events"
    set frontApp to name of first application process whose frontmost is true
end tell

tell application frontApp
    set window_name to name of front window
end tell
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,这会失败.显然,当没有打开的窗口时它会失败,但那是好的.但是,在某些情况下,例如Texmaker,它会因错误而失败.它也不适用于预览.

什么是获得窗口标题的方法,即使像Texmaker这样的情况?

macos applescript

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

C优化:条件存储,以避免弄脏缓存行

libuv源代码中,我找到了这段代码:

  /* The if statement lets the compiler compile it to a conditional store.
   * Avoids dirtying a cache line.
   */
  if (loop->stop_flag != 0)
    loop->stop_flag = 0;
Run Code Online (Sandbox Code Playgroud)

有人能解释一下吗?

什么是缓存行?

另外,我猜条件存储是一些汇编指令,它检查一些东西,如果成功,写一些值.对?

这种结构什么时候有意义?我想并不总是,因为否则编译器会一直使用条件存储,对吧?

c libuv

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