小编McS*_*Sim的帖子

std :: vector在内存中是什么样的?

我读过这std::vector应该是连续的.我的理解是,它的元素应该存储在一起,而不是分散在内存中.我简单地接受了这个事实,并在使用其data()方法获取底层连续内存时使用了这些知识.

但是,我遇到了一种情况,即向量的内存以奇怪的方式运行:

std::vector<int> numbers;
std::vector<int*> ptr_numbers;
for (int i = 0; i < 8; i++) {
    numbers.push_back(i);
    ptr_numbers.push_back(&numbers.back());
}
Run Code Online (Sandbox Code Playgroud)

我希望这能给我一些数字的向量和这些数字的指针向量.但是,当列出ptr_numbers指针的内容时,有不同的看似随机的数字,好像我正在访问错误的内存部分.

我试图每步检查一下内容:

for (int i = 0; i < 8; i++) {
    numbers.push_back(i);
    ptr_numbers.push_back(&numbers.back());
    for (auto ptr_number : ptr_numbers)
       std::cout << *ptr_number << std::endl;
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

结果看起来大致如下:

1

some random number
2

some random number
some random number
3
Run Code Online (Sandbox Code Playgroud)

因此,当我push_back()numbers向量时,它的旧元素似乎改变了它们的位置.

那究竟是什么意思呢,这std::vector是一个连续的容器,为什么它的元素会移动?是否可以将它们存储在一起,但是当需要更多空间时将它们一起移动?

编辑:std::vector仅在C++ 17之后是连续的吗?(只是为了保留对我之前的声明的评论与未来的读者相关.)

c++ memory vector contiguous

40
推荐指数
5
解决办法
6003
查看次数

显示操作栏菜单按钮

有没有办法用硬件菜单按钮在div上的操作栏中显示三个点菜单?像三星Galaxy等

android menu

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

将元组连接为类型

我正在尝试练习一些模板编程.也许有一种标准的方法可以做到这一点,我会感谢这些答案,但我的主要目标是练习模板编程技术,所以我试着自己实现它:

我需要连接多个元组,但作为类型,不像std::cat_tuple它.所以,我需要这样的东西cat<std::tuple<int, float>, std::tuple<char, bool>, ...>来获得std::tuple<int, float, char, bool, ...>的类型.

我当前的尝试失败并出现is not a template错误:

/* Concat tuples as types: */
template <typename first_t, typename... rest_t> struct cat {
    using type = typename _cat<first_t, typename cat<rest_t...>::type>::type;
                          ^^^^ cat is not a template
};
template <typename first_t, typename second_t>
struct cat<first_t, second_t> {
    using type = typename _cat<first_t, second_t>::type;
                          ^^^^ cat is not a template
};
// Concat two tuples:
template <typename, typename> struct …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming variadic-templates c++11 stdtuple

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

2019 年使用 C++20

我正在开始一个新的 C++ 项目,我可能会从事该项目并逐渐扩展一段时间(至少一年)。我正在努力跟上 C++20,我很想开始使用一些新功能。我并不真正关心支持多个编译器(GCC 或 Clang 就足够了)。到目前为止,我只是尝试了其中的一些功能,但从未考虑在实际项目中使用 C++20 功能。

编辑:我最初的问题是关于 C++20 标准的当前状态及其编译器的支持。我被要求缩小实际问题的范围,所以我将坚持使用 C++20 的主要原因:

我感兴趣的主要功能是概念。我已经在 GCC 上尝试了带有-fconcepts标志的概念。据我了解,这应该对应于概念 TS。但是当前标准中的概念状态如何?我注意到 TS 和我在 C++20 上找到的其他一些来源之间存在一些细微的语法差异。以在实际最终标准中(至少很有可能)有效的方式使用当前 GCC 的实现(或者其他编译器,它做得更好)是否现实?是否有任何可靠的来源来跟踪当前商定的概念和其他功能的规范?

原问题:

C++20 标准的现状如何?我什么时候可以期望它是完整的,或者至少处于可以安全使用它而不必担心我的代码在最终标准中无效的状态?我使用cppreference作为我的语言细节信息的主要来源。当它说 时since C++20,这是否意味着它是将保留在标准中的最终版本?

C++20 支持的状态如何?我什么时候可以期望它在 GCC、Clang 或 MSVC 中完全实现(或至少是最重要的部分)?特别是,概念和模块的状态如何?我知道 GCC 对概念有实验性支持-fconcepts(尽管cppreference说,它支持“仅 TS”),并且 GCC 的一个分支支持具有-fmodules(但不适用于概念)的模块。

c++ c++20

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

是否可以将概念作为模板参数传递?

是否可以将概念作为模板参数传递?例如:

我想做这样的事情:

template <typename t, typename u> concept range_of =
    range<t> &&
    requires (t a) {
        {*a.begin()} -> std::same_as<u &>;
    };
Run Code Online (Sandbox Code Playgroud)

但我不想给出确切的类型,而是u想给出一个概念:

template <typename t, {{concept u}}> concept constrained_range =
    range<t> &&
    requires (t a) {
        {*a.begin()} -> u;
    };
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts

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

Haskell中`-&gt;`,`=`和``的优先顺序是什么?

我想在Haskell找出一些默认的运算符优先,但我无法找到一些好的文档->=(在f x)。于是,我就:i (->):i (=)在GHCI得到一些信息,但它给了我一个语法错误。

显然,这些“令牌”只是语法的内置部分,因此:i也就不足为奇了。

我是Haskell的新手,所以我不知道这个事实,=它不会返回任何值,我只是错误地认为,它在命令式语言中的行为等同于它,这当然是错误的。

->并且,在另一方面,表现为经营者。它们分别返回类型/值和右/左关联。与实际操作员一起使用时,它们具有某种性能。

haskell operator-precedence

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

缺少 php8.1-curl 包

我正在尝试php8.1-curl在我的系统上安装该软件包 - Ubuntu 21.04。我已经添加了 Ond\xc5\x99ej Sur\xc3\xbd 的存储库 ( add-apt-repository ppa:ondrej/php),执行后apt update我可以通过 来安装php8.1和许多其他扩展(例如php8.1-zipapt install php8.1...,但php8.1-curl由于某种原因无法安装。

\n
> sudo apt install php8.1-curl\n...\nE: Unable to locate package php8.1-curl\nE: Couldn't find any package by glob 'php8.1-curl'\n
Run Code Online (Sandbox Code Playgroud)\n

我应该如何解决这个问题?我在哪里可以找到该软件包以及为什么它在我的系统上丢失了?

\n

php ubuntu apt

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