小编Zon*_*nko的帖子

什么是STL的双端队列?

我正在查看STL容器并试图弄清楚它们到底是什么(即使用的数据结构),并且deque阻止了我:我起初认为它是一个双链表,它允许从两端插入和删除恒定时间,但我对运营商[]在恒定时间内做出的承诺感到不安.在链表中,任意访问应该是O(n),对吗?

如果它是一个动态数组,它如何在恒定时间内添加元素?应该提到的是,可能会发生重新分配,并且O(1)是一个摊销成本,就像向量一样.

所以我想知道这个结构允许在恒定时间内任意访问,同时永远不需要移动到一个新的更大的地方.

c++ stl deque

173
推荐指数
7
解决办法
6万
查看次数

为什么vector(size)比new []慢?

我正在对一些STL算法进行基准测试,我对以下代码所花费的时间感到惊讶:(我用time命令测量了g ++编译代码[无优化] )

#include <vector>
struct vec2{
    int x, y;
    vec2():x(0), y(0) {}
};
int main(int argc, char* argv[]){
    const int size = 200000000;
    std::vector<vec2> tab(size); //2.26s
//  vec2* tab = new vec2[size]; //1.29s
//  tab[0].x = 0;
//  delete[] tab;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

向量初始化所需的时间是2.26秒,而new(和delete)需要1.29秒.矢量ctor做什么需要更长的时间?new[]在每个元素上调用构造函数,就像vectorctor一样,对吧?

然后我用-O3编译,它运行得更快,但两个代码之间仍然存在差距.(我分别得到了0.83秒和0.75秒)

有任何想法吗?

c++ memory-management stl

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

如何在const字符串中包含枚举值?

这个问题,我知道一个const string可以是const事物的连接.现在,一个枚举只是一组续整数,不是吗?那么为什么不能这样做:

const string blah = "blah " + MyEnum.Value1;
Run Code Online (Sandbox Code Playgroud)

或这个 :

const string bloh = "bloh " + (int)MyEnum.Value1;
Run Code Online (Sandbox Code Playgroud)

你如何在const字符串中包含枚举值?

现实生活中的例子:在构建SQL查询时,我想拥有"where status <> " + StatusEnum.Discarded.

c# string enums const

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

如何以原子方式在不存在的文件夹中创建文件?

给定一个文件的路径,我想创建这个文件,如果它们不存在,则创建通向它的目录字符串; 但我不希望我的程序的任何其他实例能够在没有文件的情况下看到基本目录.

基本上,我想立即原子地创建所需的目录和文件.根据我的理解,它必须分两步完成(创建目录,创建文件),所以我考虑使用锁文件,但同样的问题适用:我在哪里创建锁文件?我不知道需要创建多少级别的文件夹,并且在某些方面,我可能会放弃写入权限,因此锁定文件没有"安全的地方".

然后我想到使用锁目录而不是锁文件,但我找不到任何"测试和设置"方法来创建目录(Directory.CreateDirectory(path)不告诉你它是否做了什么).

那么正确的方法是什么?

c# directory file atomic

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

很好地初始化结构的联合

我正在编写一个Vec3类,为了优化目的,我没有构造函数.我还希望能够以x,y,z OR为r,g,b OR作为选项卡访问其成员.很容易,你可能会想:使用工会

template <typename T> struct Vec3_t    
{    
    union    
    {
        T val[3];    
        struct { T x, y, z; };    
        struct { T r, g, b; };    
    };
};
Run Code Online (Sandbox Code Playgroud)

然后,由于我没有ctor,我想像这样初始化它:

Vec3_t<int> v = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但我已经把双括号因为我在结构中初始化一个结构(像这样的:Vec3_t<int> v = {{1, 2, 3}})

所以,我的问题是:我怎么能这样做,以便我可以使用不同的名称进行访问,并使用一对大括号进行初始化?

我的尝试:为每个组件设置一个联合,但随后以访问作为表退出(一个人总是可以调用&v.x并将其视为一个浮点数[3],但那有点脏...而且不太安全我猜测)

c++ struct unions

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

标签 统计

c++ ×3

c# ×2

stl ×2

atomic ×1

const ×1

deque ×1

directory ×1

enums ×1

file ×1

memory-management ×1

string ×1

struct ×1

unions ×1