代码之家  ›  专栏  ›  技术社区  ›  Inertial Ignorance

C++14-这是在字符串上预先设置字符的好方法吗?

  •  2
  • Inertial Ignorance  · 技术社区  · 6 年前

    如果我想将char c添加到字符串s的开头,下面的做法是好的吗?

    string s = "oo";
    char c = 'f';
    s = c + s;
    

    在这个问题上” Prepend std::string “因此,建议这样做的答案不如建议使用成员函数的顶级答案受欢迎 .insert() 是的。

    除了效率还有什么原因吗( s = c + s 不是很有效,因为 string s 必须复制吗?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Nicol Bolas    6 年前

    既然两者都执行相同的操作,有什么原因 此外 效率? c+s 将创建一个临时字符串,因此需要两个字符串中每个字符的副本 c s ,可能是堆分配。然后将临时对象移动到给定对象中,该对象将释放其当前内存(如果有)。这些都不是廉价的业务。

    相比之下, insert 只有 如果新字符的容量不足,请执行堆分配。既然你是在开头插入的,你仍然可以继续复制。但就是这样。它的效率与在连续数组的开头插入一样。

        2
  •  2
  •   Shrikanth N    6 年前

    这个 s = c + s 操作将创建一个临时对象,该对象可能在堆上动态分配内存。执行所需的追加操作,然后将其复制回字符串变量。需要更多的指令和内存操作。

    像分配和取消分配内存这样的内存操作代价很高。 只有当字符串没有足够的连续内存时,insert才会重新分配内存。最坏的情况是 S=C+S 接近。

    尽管这不是一个很大的性能问题(考虑到最坏的情况),但从程序员的角度来看,它更优雅、更容易理解。

        3
  •  0
  •   Gem Taylor    6 年前

    还要注意,没有什么可以阻止string的实现在不需要移动内容的情况下允许两端有限制的追加。默认实现不会这样做,但是有些实现可能会在第一次预处理字符串时在字符串前面保留额外的空间,以便后续的预处理是“空闲的”。有一些向量实现可以做到这一点。