小编Kel*_*tek的帖子

为什么std :: vector不使用偏移量?

简单的问题.在向量的前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移来修改索引到向量时给出的索引将解决此问题.当然,这可能会导致(最多)内存中的2个连续数据块,但这似乎是为了将线性操作减少到恒定时间而付出的代价.

这是一个尽可能清晰的例子:

['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused.
push_front('M')
['A', 'B', 'C, _, _, _, _, 'M'] offset is -1
Run Code Online (Sandbox Code Playgroud)

然后索引时

operator[](size_t index) {
    return backing_array[(index + offset) % size]
}
Run Code Online (Sandbox Code Playgroud)

我明白这意味着可能没有一个纯粹的连续数据块,但从1移动到2似乎并不是一个巨大的交易,以换取恒定的时间推送和弹出前端.

c++ vector

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

使用unique_ptr的value_type构造unordered_map

该代码段似乎不起作用,因为唯一指针被存储到pair对象中,然后试图从其中复制。可以避免吗?

std::unordered_map<std::string,std::unique_ptr<int>> _map {
    {"hello", std::make_unique<int>(7)}
};
Run Code Online (Sandbox Code Playgroud)

完整的代码示例和编译错误可以在这里查看http://cpp.sh/7uc3a

c++ unordered-map unique-ptr c++11 c++14

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

如何使用概念检查类型中是否存在类型别名

有没有办法要求给定类型在其中定义类型别名?例如,我如何编写一个概念来检查这是否有效,其中该概念检查类型 T 是否具有类型别名Bar

template <typename T>
concept HasBarType = ????;

template <HasBarType T>
void foo() {
    [[maybe_unused]] T::Bar bar;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

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

为什么 std::list 可以有一个 T 类型的分配器?

我正在尝试实现我自己的符合标准的链表,但我似乎无法弄清楚为什么你会想要一个 T 分配器。在我的实现中,节点类保存 T 本身,而不是指向存储在内存中其他位置的 T 的指针,因此 T 永远不会被显式分配,而是只作为节点的一部分创建。我会理解为什么你可能想要一个节点分配器,但为什么是 T?

我的节点的简化版本在这里。

class Node {
    Node* next, prev;
    T data; // Not T*
}
Run Code Online (Sandbox Code Playgroud)

c++ templates linked-list allocator

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

当普通命令成功时 git alias 失败

我的 ~/.gitconfig 文件中存储了以下别名

reset-master = reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))

但是当我运行时git reset-master它失败了

$ git reset-master
error: unknown option `abbrev-ref'
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] 
[<commit>]
   or: git reset [-q] [<tree-ish>] [--] <paths>...
   or: git reset --patch [<tree-ish>] [--] [<paths>...]

    -q, --quiet           be quiet, only report errors
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and …
Run Code Online (Sandbox Code Playgroud)

git version-control alias

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

有一个线程拥有它运行C ++的函子

如果要在c ++中的新线程中运行函子,则必须创建函子对象,然后将对它的引用传递给线程构造函数。这可以工作,但是将线程和函子对象作为单独的东西留给您。是否有可能拥有一个函子本身的线程,当在该线程上调用join时,该函子会被清除?可能的API之类的东西可能thread<FunctorType>(args, for, functor)会在线程类中创建functor对象,然后运行它。

c++ multithreading stdthread c++17

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