我们可以依靠减少容量的技巧吗?

2024-03-11

它真的能保证以下减少容量的技巧在任何地方都能“起作用”吗?

int main() {
   std::string s = "lololololol";
   s = "";                        // capacity still non-zero

   string(s).swap(s);             // ?
}

它似乎对我来说“不起作用”(因为容量保持非零),而且我在标准中找不到任何比“内容”必须在两者之间交换[此处,相同]对象。

同样,对于序列容器:

int main() {
   vector<int> v { 1,2,3,4,5 };
   v.clear();                   // capacity still non-zero

   vector<int>(v).swap(v);      // ?
}

据我所知,这个“技巧”已经被半广泛使用。也许这种广泛采用是被误导的?

(Of course, in C++11 we have shrink_to_fit [albeit non-binding] instead, making this kind of moot.)


我一直被教导没有保证降低容量的标准方法。所有方法都已经(并且仍然是)实现定义的。

§ 23.2.1\8 说:

表达方式a.swap(b), 对于容器a and b一个标准的 集装箱类型除外array,应交换以下值a and b无需对个体调用任何移动、复制或交换操作 容器元素...

这保证了向量的内部指针必须被交换。
但是,我找不到任何可以保证新创建的向量容量的东西。

§ 21.4.2\1 说其中之一basic_string默认构造函数的后置条件是capacity()返回一个未指定的值。
§ 21.4.2\3 说 basic_string 复制构造函数的后置条件之一是capacity()返回一个值至少与size().
§ 21.4.6.8\2 说string::swap以恒定时间运行,这(有效地)要求交换内部指针。

据我所知,符合要求的实现可能有string::max_size() { return 4;},因此将所有内部结构从一个缓冲区交换到另一个缓冲区将是常数时间。 (但向量不能做到这一点)

显然,对这一切持保留态度。我引用的是 2011 年 2 月 28 日的 C++ 草案,但我找不到向量复制构造函数的规范。另外,找不到证据for不等于找到证据against.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以依靠减少容量的技巧吗? 的相关文章

随机推荐

  • 从 Nib 或 Storyboard 设置 WKWebView 上的 WKWebViewConfiguration

    在 iOS 11 中 Apple 添加了在笔尖和情节提要上添加 WKWebViews 出口的功能集 使用自动设置的默认 WKWebViewConfiguration 时 它似乎工作正常 但是 我希望能够使用自定义 WKWebViewConf
  • 如何从高图表中删除“值”和“系列”?

    I m using highcharts on my website which looks great but I now want to remove these two labels from the chart 我尝试禁用各种标签
  • 如何获取google地图上的平均交通数据

    我想像这样在谷歌地图上显示平均流量层 但是 这张地图显示的是实时流量数据 而不是我想在谷歌地图上显示一段时间内的平均流量 这可能吗 或者任何其他地图 API 可以提供帮助吗 请为该问题加注星标问题跟踪器链接 https issuetrack
  • 如何在com.google.android.material.chip.Chip上设置chipText?

    我正在调查以下提供的材料成分 implementation group com google android material name material version 1 0 0 alpha3 namely com google and
  • PHP 彗星 usleep 阻塞 apache mpm?

    我那里有一颗彗星我以这种方式运行 while 循环 items statement gt fetchAll statement is a PDO Statement iteration 0 while count items 0 itera
  • 使用复制的 git 存储库安全吗?

    如果我使用以下命令复制跟踪文件夹rsync a or cp R 然后我可以像使用 git 克隆一样使用该副本吗 或者这会导致各种奇怪的问题吗 这一切都在我的计算机上运行 因此没有其他人访问该存储库 显然 git cloned 目录知道它是从
  • 动态计算 Pandas 中公式的表达式

    我想使用一个或多个数据帧列执行算术pd eval 具体来说 我想移植以下计算公式的代码 x 5 df2 D df1 A df1 B x 使用代码pd eval 使用理由pd eval是我想自动化许多工作流程 因此动态创建它们对我很有用 我的
  • 在 Linux 上以汇编形式输出整数

    这需要在纯汇编中完成 即没有库或对 C 的调用 我理解问题的本质 需要将整数除以 10 将一位数余数转换为 ASCII 输出 然后用商重复该过程 但由于某种原因 它不起作用 我在 x86 上使用 NASM 这是我到目前为止所拥有的 不输出任
  • UICollectionView 的单元格消失

    发生了什么 目前我有一个应用程序使用两个UICollectionViews里面一个UITableView 通过这种方式 我创建了一个看起来像 Pulse News 的应用程序 我的问题是 有时第 6 行和第 11 行完全消失 在本应是单元格
  • 我想通过 graph api 分享朋友的帖子

    我想通过 graph api 在 facebook 上分享一些帖子 但是没有这样的api 只有 饲料 存在 我尝试使用 me feed 图形 API 操作来分享我朋友的帖子 以及页面中的帖子 但它和我在 Facebook 网站上分享的不一样
  • 开发 BlackBerry OS6 需要哪个版本的 Blackberry JRE

    我下载了适用于 BlackBerry 的 Eclipse 插件 默认情况下具有 BlackBerry OS 7 运行时 我需要定位 BlackBerry OS 6 和 OS 7 设备 这也适用于 BlackBerry OS 6 还是我需要更
  • 加快我的批处理文件解析速度

    我有一个批处理文件 它从一个 txt 文件中获取输入 如下所示 Microsoft R Windows Script Host Version 5 8 Copyright C Microsoft Corporation All rights
  • System.String[] Split(Char[])' 方法无法识别

    我有以下数据 我想使用 Linq to Entities 过滤数据 但我收到异常 LINQ to Entities 无法识别方法 System String Split Char 方法 并且该方法不能翻译为 存储表达式 我的表中有以下数据
  • 为因子的每个级别附加一行总和

    我想为每个 Reg 添加一行总和 如下所示 Reg Res Pop 1 Total 1000915 2 A Urban 500414 3 A Rural 500501 4 Total 999938 5 B Urban 499922 6 B
  • UIPageViewController 在旋转时重置为第一页

    当用户旋转设备时 UIPageViewController从它显示的任何页面淡出回到第一页 这确实很烦人 尤其是当用户进入文档的多个页面时 它仅出现在 iOS 6 中 当用户旋转设备时 spineLocationForInterfaceOr
  • 如何分析Delphi应用程序中过多的内存消耗(PageFileUsage)?

    这是这个问题的后续 如何解释 FastMM 或 GetProcessMemoryInfo 报告的内存使用情况的差异 https stackoverflow com q 9704786 184404 我的 Delphi XE 应用程序使用大量
  • Visual Studio 大型解决方案

    我已经为我的 Web 应用程序提供了一个解决方案 其中包含近 12 个项目和 3 个网站 有一些项目用于多个网站 例如 MyProject BE MyProject BLL MyProject DAL MyProject Controls
  • 如何在程序中向scrapy爬虫传递参数?

    我是 python 和 scrapy 的新手 我用的是这个博客的方法以编程方式运行多个 scrapy 蜘蛛 http kirankoduru github io python multiple scrapy spiders html在烧瓶应
  • 设置目录的访问权限 - 接收异常“无法设置标志”

    我正在尝试编程允许对目录上的 ASPNET 帐户进行写访问 我使用以下代码来执行此操作 请注意 我希望 ASPNET 的 允许写入访问权限 也传播到子对象 static void Main string args FileSecurity
  • 我们可以依靠减少容量的技巧吗?

    它真的能保证以下减少容量的技巧在任何地方都能 起作用 吗 int main std string s lololololol s capacity still non zero string s swap s 它似乎对我来说 不起作用 因为