小编Hea*_*eek的帖子

std :: map具有高效的第n个元素访问权限

我有一组数据需要存储在有序映射中(即通过键有效插入,删除和定位项目),但我还需要能够找到第n个元素而无需遍历整个映射(有时可能会有成千上万的物品).

我知道一种方法:使用红色/黑色树,但也要保留每个节点的一条腿上的子项目总数.它使插入和删除速度稍慢(因为你必须像沿着路径更新路径上每个节点的计数),但是你可以在找到密钥的大致相同的时间内找到任何n第n个元素.

我想知道是否存在我可以使用的这种东西的现有C++实现.如果没有,我可以自己写,但我真的不愿意.


编辑:我得到了一些关于用例的澄清.我稍微误解了一下:在按键查找项目后,他们需要能够有效地找出找到的项目是什么索引,以正确显示滚动条.

一个合理的需求,我上面描述的数据结构仍然适用于它,所以我仍然在寻找答案.但是,由于似乎还没有人提出一个,我将开始自己编码.

c++ data-structures

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

跳过列表 - 曾经使用过吗?

我想知道这里是否有人使用跳过列表.它看起来与平衡二叉树具有大致相同的优点,但实现起来更简单.如果你有,你是自己编写的,还是使用预先编写的库(如果有的话,它的名字是什么)?

binary-tree skip-lists data-structures

19
推荐指数
4
解决办法
5962
查看次数

将数据嵌入C++程序中

我有一个使用SQLite的C++程序.我想将SQL查询存储在一个单独的文件中 - 纯文本文件,而不是源代码文件 - 但是将该文件嵌入可执行文件中,就像资源一样.

(这必须在Linux上运行,因此据我所知,我无法将其存储为实际资源,但如果它适用于Windows,那将是完美的.)

有没有简单的方法,或者它是否有效地要求我为Linux编写自己的资源系统?(很容易,但需要更长的时间.)

c++ linux sqlite

17
推荐指数
1
解决办法
7135
查看次数

"你不能转发声明重载运算符的类&"?

在Google C++样式指南中,有一个关于运算符重载的部分有一个奇怪的声明:

超载也有令人惊讶的后果.例如,您无法转发声明重载的类 operator&.

这似乎不正确,我找不到任何导致GCC出现问题的代码.有谁知道那个陈述是指什么?

c++ gcc

14
推荐指数
3
解决办法
1479
查看次数

比较函数类型与运算符<

Google C++样式指南中,有关运算符重载部分建议不要重载任何运算符("在罕见的特殊情况下除外").具体来说,它建议:

特别是,不要重载 operator==operator<只是使您的类可以用作STL容器中的键; 相反,您应该在声明容器时创建相等和比较函数类型.

我对这样的仿函数看起来有点模糊,但我的主要问题是,你为什么要为此编写自己的仿函数?不会定义operator<,并使用标准std::less<T>函数,更简单?使用一个优于另一个是否有任何优势?

c++ stl coding-style

10
推荐指数
3
解决办法
8597
查看次数

在Java中使用"禁用"类?

我的雇主需要一个扩展的Java类org.eclipse.rse.core.subsystems.SubSystem,用于Eclipse插件.不幸的是,实现它的库(org.eclipse.rse.ui_3.3.318.201404091445.jar如果有帮助)的访问规则标记了它不明确允许的所有"禁止",并且没有明确允许该类.

我可以更改访问规则以允许访问该类,但是当插件安装在另一台机器上时会导致问题吗?

java eclipse

10
推荐指数
1
解决办法
643
查看次数

更好的方法使用C++命名参数成语?

我一直在为Windows开发一个GUI库(作为个人辅助项目,没有实用性的愿望).对于我的主窗口类,我已经设置了一个选项类的层次结构(使用命名参数成语),因为一些选项是共享的,而其他选项是特定于特定类型的窗口(如对话框).

命名参数Idiom的工作方式,参数类的函数必须返回它们被调用的对象.问题是,在层次结构中,每个都必须是一个不同的类 - createWindowOpts标准窗口的createDialogOpts类,对话框的类等.我通过制作所有选项类模板来解决这个问题.这是一个例子:

template <class T>
class _sharedWindowOpts: public detail::_baseCreateWindowOpts {
    public: ///////////////////////////////////////////////////////////////
    // No required parameters in this case.
    _sharedWindowOpts() { };

    typedef T optType;

    // Commonly used options
    optType& at(int x, int y) { mX=x; mY=y; return static_cast<optType&>(*this); }; // Where to put the upper-left corner of the window; if not specified, the system sets it to a default position
    optType& at(int x, int y, int width, int height) { …
Run Code Online (Sandbox Code Playgroud)

c++ named-parameters

9
推荐指数
2
解决办法
2932
查看次数

存储巨大的std :: map,主要是在磁盘上

我有一个可能产生大量数据的C++程序 - 数十亿个不同大小的二进制记录,最可能少于256个字节但有几个延伸到几个K.大多数记录很少被查看程序创建后,但有些将定期访问和修改.没有办法分辨它们何时被创建.

考虑到数据量,我无法将其全部存储在内存中.但由于数据只需要通过其编号(64位整数)进行索引和访问,因此我不需要成熟的数据库程序的开销.理想情况下,我希望将其视为std::map存储在磁盘上的数据,直到请求为止.

是否有一个已经编写的库可以完成我正在寻找的工作,或者我是否需要自己编写?

编辑:经过一番思考后,我意识到Rob Walker的答案有一个有用的观点:我很难从一个真正的数据库获得的家庭酿造类中获得与数据完整性相同的任何地方. .

虽然BerkeleyDB(正如RHM所建议的)看起来就像我们正在寻找的那样,但双重许可是我们不想处理的头痛问题.当我们完成代码并且可以证明它会从BerkeleyDB(它可能会)中获益时,我们将重新审视该问题.

我确实看过Ferruccio对stxxl的建议,但是我无法告诉它如何处理被中断和重启的程序(可能有更改).有了这么多的数据,我不想废弃它已经完成的东西并且每次重新开始,如果可以保存一些数据的话.

所以我们决定使用SQLite数据库,至少在初始开发时使用.感谢所有回答或投票的人.

c++ data-structures

9
推荐指数
2
解决办法
3542
查看次数

避免使用dynamic_cast/RTTI

我最近正在为一个侧面项目(cpp-markdown图书馆,好奇的)编写一段C++代码,并遇到了一个我想要一些意见的编码问题.

cpp-markdown有一个名为的基类Token,它有许多子类.主要亚类中的两个是Container(其保持其它的集合Token或多个)和TextHolder(用作基类Token包含当然文本,S).

大多数处理都是通过虚函数处理的,但有些处理在单个函数中处理得更好.对于这一点,我结束了使用dynamic_cast,以向下转换从指针Token*到它的一个子类,所以我可以调用特定于子类和它的子类的功能.铸造不可能失败,因为代码能够通过虚函数(例如isUnmatchedOpenMarker)来判断何时需要这样的东西.

我还有两种方法可以解决这个问题:

  1. 创建我想要作为虚函数调用的所有函数Token,并为每个子类留下一个空体,除了需要处理它们的子类,或者......

  2. 创建一个虚函数,Token该函数将返回正确类型的指针,指向this在某些子类型上调用它时,如果在其他任何子类型上调用则返回空指针.基本上是我已经在那里使用的虚拟功能系统的扩展.

对我来说,第二种方法似乎比现有方法和第一种方法都要好.但我想知道其他有经验的C++开发人员对它的看法.或者我是否担心过多的琐事.:-)

c++ casting

8
推荐指数
2
解决办法
6753
查看次数

OpenSSL现在是否自动处理CRL(证书撤销列表)?

我正在使用的参考书(网络安全与OpenSSL,Viega,Messier和Chandra),第133页,指出:

[...]应用程序必须加载CRL文件,以便内部验证过程确保其验证的每个证书都不会被撤销.不幸的是,OpenSSL的CRL功能在0.9.6版本中不完整.从0.9.7开始的新版本中将完成利用CRL信息所需的功能.[...]

我在OpenSSL文档中找不到任何有用的信息(毫不奇怪).在我看来,检查CRL应该是OpenSSL验证过程的自动部分.现在是否自动处理CRL,或者我是否仍然必须通过书中列出的所有垃圾来费力地验证证书是否未被撤销?

一个密切相关的问题:该SSL_CTX_set_default_verify_paths函数是否也加载了CRL路径?

openssl

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