如何将char数组/ String复制C ++的变量次数

时间:2013-06-28 17:15:28

标签: c++ string string-concatenation

问题:

在C ++中:给定std :: string s =“copyme”如何创建一个字符串b,即“copymecopymecopyme”或任何通用的s + s + ... n次?


可能的解决方案

一个可能的解决方案是执行for循环的方法/宏,但这样效率非常低。

执行此字符串复制操作的有效方法是什么,例如正如前一作者在python或ruby中以'string'* n的风格所说的那样。

一个相对有效的循环是分配strlen * n,然后多次复制字符而不是(...){str + = copy_this_string;},它会执行多个副本并分配。

另一种解决方案是使用字符串缓冲区。


SO澄清

键:没有使用宏。 澄清:问题中的'char数组'是因为在原始问题中,由于字符串中有一个字符,所有答案都忽略了复制一般流并专注于使用'。'因为它具有易于访问的方法,例如流构造函数。

“重复”:How to repeat a string a variable number of times in C++? 除了大多数答案之外,所有使用的方法都只重复了一个字符,例如String构造函数和插入方法,它们没有回答原始问题,当我寻找有效的方法时没有用。

2 个答案:

答案 0 :(得分:3)

如果您担心字符串'+ ='操作效率低下,您可以进行一项优化是在目标字符串容器中保留内存。这可以避免对记忆的低效重新分配 例如:

std::string s = "copyme";
std::string b;
target.reserve(s.length()*5);
for (int index = 0; index < 5; ++index)
{
    b += s;
}

我检查了我的linux系统上的std :: string实现,看来这个方法只要初始预留足够大就不会导致重新分配数组。

template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string<_CharT, _Traits, _Alloc>::
append(const basic_string& __str)
{
    const size_type __size = __str.size();
    if (__size)
    {
        const size_type __len = __size + this->size();
        if (__len > this->capacity() || _M_rep()->_M_is_shared())
            this->reserve(__len);
        _M_copy(_M_data() + this->size(), __str._M_data(), __size);
        _M_rep()->_M_set_length_and_sharable(__len);
    }
    return *this;
}    

答案 1 :(得分:1)

一个简单的循环可以。如果您担心重新分配,可以在复制字符串上调用std::string::reserve

#include <string>
#include <iostream>

int main()
{
  const int num + 5;
  std::string s = "copyme";
  std::string b;
  b.reserve(s.size() * num); // reserve space for num* "copyme"
  for (int i = 0; i < num; ++i) b += s;

  std::cout << b << std::endl;
}