刚才,我正在读Josuttis的STL书.
据我所知 - c ++ vector是一个可以重新分配的c-array.所以,据我所知,为什么在push_back()之后所有迭代器和引用都会变得无效.
但我的问题是关于std :: deque.据我所知,它是大块的数组(c-array的c-array).因此push_front()在开头插入元素,如果没有空格,则deque分配新块,并将元素放在已分配块的末尾.
在中间插入()后,所有引用和迭代器都变得无效,我理解为什么 - 所有元素都被移动.但我真的误解了这句话"...在push_back()和push_front()之后所有引用都保持有效,但迭代器没有"(同样的短语可以在@ standard:23.2.2.3找到)
这是什么意思?!如果引用有效,则deque无法重新分配(==移动)其元素.那么为什么迭代器变得无效呢?为什么我不能在非移动元素插入后使用它们?或者这句话意味着,我不能确定迭代器相等于begin()或end()和溢出?
另外,我想提一下,在erase()之后,所有迭代器和引用都保持有效(除了擦除的:-)).
PS:请不要以"标准"形式回答:"它不能被使用,因为标准是这样说的".我想明白为什么,会发生什么.
我发现了一些我无法用Python re模块解释的东西.编译(a*)*或(a*|b)*抛出错误:
引发错误,v#无效表达sre_constants.error:没有什么可重复的
我在javascript中测试了这个正则表达式,似乎没问题.
这是一个错误吗?
我想为我的类实现一个Swap()方法(让我们称之为A)来创建copy-and-swap operator =().据我所知,交换方法应该通过交换类的所有成员来实现,例如:
class A
{
public:
void swap(A& rhv)
{
std::swap(x, rhv.x);
std::swap(y, rhv.y);
std::swap(z, rhv.z);
}
private:
int x,y,z;
};
Run Code Online (Sandbox Code Playgroud)
但如果我有一个const成员,我该怎么办?我不能为它调用std :: swap,所以我不能编码A :: Swap().
编辑:其实我的课程有点复杂.我想序列化和反序列化它.Const成员是一个不会在此对象中更改(例如其ID)的数据.所以我想写一些类似的东西:
class A
{
public:
void Serialize(FILE* file) const
{
fwrite(&read_a, 1, sizeof(read_a), file);
}
void Deserialize(FILE* file) const
{
size_t read_a;
fread(&read_a, 1, sizeof(read_a), file);
A tmp(read_a);
this->Swap(tmp);
}
private:
const size_t a;
};
Run Code Online (Sandbox Code Playgroud)
并调用此代码:
A a;
FILE* f = fopen(...);
a.Deserialize(f);
Run Code Online (Sandbox Code Playgroud)
对于这种模糊的措辞,我很抱歉.
我正在编写存储数据的项目,所以我需要压缩它.我试过zlib,但它是我项目的瓶颈.所以也许有更快的解决方案.我不需要很高的压缩率,但我正在寻找真正快速的压缩.是否有除zlib的任何其他数据压缩库,这是真正的自由,可以在专有软件中使用(项目,我的工作,是不是GPL为主).我的项目是在C++上,我需要压缩char*文本数组.
我正在将我的c ++ windows代码(msvc和intel)移植到Linux(g ++).代码使用了很多模板(我喜欢元编程;-).但是我无法编译这段代码:
template <class TA>
struct A
{
template <class TAB> struct B;
};
template <class TC>
struct C {};
template <class TD>
struct D
{
template <class TTD> class T {};
};
template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
int foo;
};
Run Code Online (Sandbox Code Playgroud)
g ++告诉我,在A :: B的定义中,C类具有无效的模板参数.但是在msvc和intel上运行良好!这有什么问题?PS:对不起,我无法发布原始代码,因为它太模板复杂了.但是这个例子实际上是相同的,并且在g ++上给出了相同的错误.谢谢.
更新:我发现问题出现在T. g ++的TBA参数中,并不喜欢在定义中使用第二个模板.
这两个命令之间有什么区别(我想回滚到修订版1):
hg update -r 1
hg backout -r 1 --merge
Run Code Online (Sandbox Code Playgroud)
(在示例提示修订版中为3)
我正在调试我的项目,但找不到错误.最后我找到了它.看看代码.你认为一切都好,结果将是"好的!好的!好的!",不是吗?现在用VC编译它(我已经尝试过vs2005和vs2008).
#include <math.h>
#include <stdio.h>
int main () {
for ( double x = 90100.0; x<90120.0; x+=1 )
{
if ( cos(x) == cos(x) )
printf ("x==%f OK!\n", x);
else
printf ("x==%f FAIL!\n", x);
}
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
神奇的双常数是90112.0.当x <90112.0一切正常时,当x> 90112.0时 - 不!你可以将cos改为罪.
有任何想法吗?不要忘记罪和cos是周期性的.
为什么这段代码不能编译?
template <class T>
class A
{
public:
A(T t) : t_(t) {}
private:
T t_;
};
int main()
{
A a(5.5);
// A<double> a(5.5); // that's what i don't want to do
}
Run Code Online (Sandbox Code Playgroud)
我希望模板参数是隐式的.
就像在这个例子中:
template<class T>
T Foo(T t) { return t; }
// usage:
Foo(5.5);
Run Code Online (Sandbox Code Playgroud)
更新:命名构造函数idiom对我来说是不可接受的.我想把这个类用于RAII.这样做的唯一方法是const A& a = A::MakeA(t),但它很难看!