小编Max*_*xym的帖子

具有自定义指针类型的内存分配器

我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它std::vector.它在Xcode上运行得非常好.但是当我尝试在Visual Studio 12(2013)中构建相同的代码时,构建失败并出现以下错误:

... vector(873):错误C2660:' std::_Wrap_alloc< my_allocator< int > >::construct':函数不带2个参数

问题出在push_back方法中:

void push_back(value_type&& _Val)
    {
    ....
        this->_Getal().construct(this->_Mylast,
            _STD forward<value_type>(this->_Myfirst[_Idx]));
    ....
    }
Run Code Online (Sandbox Code Playgroud)

错误消息有点令人困惑.真正的问题是this->_Mylast类型my_allocator< int >::pointer,它是一个智能指针,而构造方法是期望的int*.

所以,问题很简单:自定义内存分配器中使用的指针类型有哪些要求?应该X::pointer可以转换为原始指针?如果是的话,它会让它们变得毫无用处.

实际上我希望这行代码看起来像:

this->_Getal().construct(addressof(*(this->_Mylast)),
            _STD forward<value_type>(this->_Myfirst[_Idx]));
Run Code Online (Sandbox Code Playgroud)

让我们尝试在C++标准中找到答案,其中说:

[17.6.3.5-5]分配器类型X应满足CopyConstructible(17.6.3.1)的要求.的X::pointer,X::const_pointer,X::void_pointer,和X::const_void_pointer类型应满足NullablePointer(17.6.3.3)的要求.对这些类型的构造函数,比较运算符,复制操作,移动操作或交换操作不应通过异常退出.X::pointer并且X::const_pointer还应满足随机访问迭代器的要求(24.2)

如果我们看看NullablePointer reqs,他们会添加一些其他要求:

[17.6.3.3] NullablePointer类型是一种类似指针的类型,支持空值.如果符合以下条件,则类型P满足NullablePointer的要求:
(1.1) - P满足EqualityComparable,DefaultConstructible,CopyConstructible,CopyAssignable和Destructible的要求......

如果我检查随机访问迭代器的要求,我也没有找到任何明确提到它的转换为原始指针.但是在很少的地方使用了方法addressof(例如24.2.1-5).

此外,它并不是Microsoft std::vector实现中唯一X::pointer与假定原始指针相等的地方.我想知道,我错过了什么?

编辑:我将在这里添加一段my_allocator deffinition:

class my_allocator
{
public:

typedef std::size_t          size_type;
typedef std::ptrdiff_t …
Run Code Online (Sandbox Code Playgroud)

c++ pointers memory-management standard-library c++11

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

C++中的订单维护数据结构

我正在寻找一种能够有效解决订单维护问题的数据结构.换句话说,我需要有效率

  • 插入(在中间),
  • 删除(在中间),
  • 比较容器中元素的位置.

我找到了讨论这个问题的好文章:

算法非常有效(某些状态对于所有操作都是O(1)),但它们似乎并不是微不足道的,我想知道是否存在这些或类似数据结构的开源C++实现.

我已经看到了相关的主题,建议了所有操作的时间复杂度为O(log n)的一些更简单的方法,但在这里我正在寻找现有的实现.

如果在其他一些流行的语言中有一个例子,它也会很好,这样我至少可以在尝试自己实现它之前尝试它.

细节

我要去

  • 维护一个指向对象的指针列表,
  • 我不时需要更改对象的顺序(删除+插入),
  • 给定一个对象的子集,我需要能够快速对它们进行排序并按正确的顺序处理它们.

注意

标准的订购容器(std :: set,std :: map)不是我想要的,因为它们会维护我的订单,但我需要自己订购元素.类似于我对std :: list的处理,但是位置比较是线性的,这是不可接受的.

c++ algorithm data-structures

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

对haskell中的列表强制严格

我做了非常耗时的算法,结果产生了一个短字符串.当我尝试打印它(通过putStrLn)时,它会逐个字符显示在屏幕上.我确实理解为什么会这样,我试图在实际打印之前强制评估字符串.

myPrint !str = putStrLn str
Run Code Online (Sandbox Code Playgroud)

但这帮助很少.当我在调试中运行程序时,我注意到!str强制仅对第一个字符进行评估.

有谁知道为什么会这样,以及如何处理这个?

evaluation haskell lazy-evaluation data-structures strictness

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

Haskell中不同类型的乘法

我是哈斯凯尔的新手,我不时遇到一个问题,我将用几句话来描述.想象一下,我想为不同的度量声明不同的类型,因此Haskell类型系统会在我的公式中找到错误:

newtype Dist = Km Float
newtype Time = H Float
newtype Velocity = KmH Float

(/) :: Dist ? Time ? Velocity
(Km d) / (H t) = KmH (d / v)

(*) :: Velocity ? Time ? Dist
(KmH v) * (H t) = Km (v * t)
Run Code Online (Sandbox Code Playgroud)

所以,每当我尝试在我的公式中使用错误的度量单位时,编译器就会咬人.

问题是我不能像这样实现ad-hoc polimorphism.使用此代码,我带来了歧义 - 编译器可以区分我的运算符*和Prelude中定义的运算符.由于我需要不同类型的参数,因此也无法声明Num类的实例.

我想知道人们通常如何解决这个问题.

提前致谢!

haskell types

10
推荐指数
2
解决办法
1344
查看次数

haskell矩阵实现性能

我听说过很多关于用Haskell编写的程序的惊人性能,并希望进行一些测试.因此,我为矩阵运算编写了一个"库",只是为了将它的性能与用纯C编写的相同内容进行比较.首先,我测试了500000个矩阵的乘法性能,并注意到它是......永无止境的(即结束于所以10分钟后出现内存异常)!在研究了haskell后,我设法摆脱了懒惰,我设法获得的最佳结果比C中的等效物慢20倍.所以,问题是:你能否查看下面的代码并告诉它的性能是否可以改善了一点?20次仍然令我失望.

import Prelude hiding (foldr, foldl, product)
import Data.Monoid
import Data.Foldable

import Text.Printf
import System.CPUTime

import System.Environment

data Vector a = Vec3 a a a
              | Vec4 a a a a
                deriving Show

instance Foldable Vector where
  foldMap f (Vec3 a b c) = f a `mappend` f b `mappend` f c
  foldMap f (Vec4 a b c d) = f a `mappend` f b `mappend` f c `mappend` f d

data Matr a = Matr !a !a !a !a …
Run Code Online (Sandbox Code Playgroud)

performance haskell

7
推荐指数
2
解决办法
3693
查看次数

C++中的默认构造函数

我对这个问题很好奇,但在互联网上找不到答案.

我们假设我们有简单的标题:

// SimpleHeader.h
class SimpleClass
  {
  int i;
  }
Run Code Online (Sandbox Code Playgroud)

我们知道,为这个类自动生成默认构造函数.

现在我还有2个文件:

// First.cpp
#include <SimpleHeader.h>
// ...
SimpleClass a;
// ...
Run Code Online (Sandbox Code Playgroud)

//Second.cpp
#include <SimpleHeader.h>
// ...
SimpleClass b;
// ...
Run Code Online (Sandbox Code Playgroud)

First.obj和Second.obj都包含该类的代码

c++ default-constructor

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

Qt 5.0:将C++方法暴露给Java Script

我试图将一个对象作为全局属性公开给Java Script,其中包含以下方法:

Q_INVOKABLE MyObject* createMyObject();
Run Code Online (Sandbox Code Playgroud)

MyObject派生自QObject.

当我在Java Script中调用此方法时,它返回一个类型为的对象:

QVariant(MyObject*)
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以自动将其转换为QJSValue,以便我可以在脚本中进一步使用它?

javascript qt qt5

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

一次覆盖两个方法

下面的代码令人惊讶地编译在VS 2012中.

方法C :: f()覆盖两个基类中的方法.

这是标准行为吗?我查看了C++ 11标准,并没有发现任何明确提到这种情况.

class A { virtual void f() = 0; };

class B { virtual void f() = 0; };

class C : public A, public B { 
  virtual void f() override { } 
};
Run Code Online (Sandbox Code Playgroud)

c++ standards standards-compliance c++11

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