小编f0b*_*b0s的帖子

在push_front()之后C++ deque的迭代器失效

刚才,我正在读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:请不要以"标准"形式回答:"它不能被使用,因为标准是这样说的".我想明白为什么,会发生什么.

c++ iterator stl deque

9
推荐指数
1
解决办法
3117
查看次数

Python正则表达式奇怪的行为

我发现了一些我无法用Python re模块解释的东西.编译(a*)*(a*|b)*抛出错误:

引发错误,v#无效表达sre_constants.error:没有什么可重复的

我在javascript中测试了这个正则表达式,似乎没问题.

这是一个错误吗?

python regex

9
推荐指数
3
解决办法
4668
查看次数

使用const成员的交换方法

我想为我的类实现一个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)

对于这种模糊的措辞,我很抱歉.

c++ swap const

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

免费的非gpl数据压缩库

我正在编写存储数据的项目,所以我需要压缩它.我试过zlib,但它是我项目的瓶颈.所以也许有更快的解决方案.我不需要很高的压缩率,但我正在寻找真正快速的压缩.是否有除zlib的任何其他数据压缩库,这是真正的自由,可以在专有软件中使用(项目,我的工作,是不是GPL为主).我的项目是在C++上,我需要压缩char*文本数组.

c++ compression zlib

6
推荐指数
3
解决办法
4947
查看次数

g ++模板问题

我正在将我的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参数中,并不喜欢在定义中使用第二个模板.

c++ templates porting g++

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

Mercurial更新和退出之间的区别

这两个命令之间有什么区别(我想回滚到修订版1):

hg update -r 1
hg backout -r 1 --merge
Run Code Online (Sandbox Code Playgroud)

(在示例提示修订版中为3)

mercurial

5
推荐指数
1
解决办法
1989
查看次数

Visual C++ math.h错误

我正在调试我的项目,但找不到错误.最后我找到了它.看看代码.你认为一切都好,结果将是"好的!好的!好的!",不是吗?现在用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是周期性的.

c++ floating-point math.h

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

构造函数中的C++模板参数

为什么这段代码不能编译?

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),但它很难看!

c++ templates

3
推荐指数
1
解决办法
3235
查看次数

标签 统计

c++ ×6

templates ×2

compression ×1

const ×1

deque ×1

floating-point ×1

g++ ×1

iterator ×1

math.h ×1

mercurial ×1

porting ×1

python ×1

regex ×1

stl ×1

swap ×1

zlib ×1