我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它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) 我正在寻找一种能够有效解决订单维护问题的数据结构.换句话说,我需要有效率
我找到了讨论这个问题的好文章:
算法非常有效(某些状态对于所有操作都是O(1)),但它们似乎并不是微不足道的,我想知道是否存在这些或类似数据结构的开源C++实现.
我已经看到了相关的主题,建议了所有操作的时间复杂度为O(log n)的一些更简单的方法,但在这里我正在寻找现有的实现.
如果在其他一些流行的语言中有一个例子,它也会很好,这样我至少可以在尝试自己实现它之前尝试它.
细节
我要去
注意
标准的订购容器(std :: set,std :: map)不是我想要的,因为它们会维护我的订单,但我需要自己订购元素.类似于我对std :: list的处理,但是位置比较是线性的,这是不可接受的.
我做了非常耗时的算法,结果产生了一个短字符串.当我尝试打印它(通过putStrLn)时,它会逐个字符显示在屏幕上.我确实理解为什么会这样,我试图在实际打印之前强制评估字符串.
myPrint !str = putStrLn str
Run Code Online (Sandbox Code Playgroud)
但这帮助很少.当我在调试中运行程序时,我注意到!str强制仅对第一个字符进行评估.
有谁知道为什么会这样,以及如何处理这个?
evaluation haskell lazy-evaluation data-structures strictness
我是哈斯凯尔的新手,我不时遇到一个问题,我将用几句话来描述.想象一下,我想为不同的度量声明不同的类型,因此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编写的程序的惊人性能,并希望进行一些测试.因此,我为矩阵运算编写了一个"库",只是为了将它的性能与用纯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) 我对这个问题很好奇,但在互联网上找不到答案.
我们假设我们有简单的标题:
// 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都包含该类的代码
我试图将一个对象作为全局属性公开给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,以便我可以在脚本中进一步使用它?
下面的代码令人惊讶地编译在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++ ×4
haskell ×3
c++11 ×2
algorithm ×1
evaluation ×1
javascript ×1
performance ×1
pointers ×1
qt ×1
qt5 ×1
standards ×1
strictness ×1
types ×1