-1

问题:

在 C++ 中:给定 std::string s = "copyme" 我怎样才能制作一个字符串 b 这是 "copymecopymecopyme" 或任何广义的 s + s + ... n 次?


可能的解决方案

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

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

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

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


所以澄清

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

“重复”:如何在 C++ 中将字符串重复可变次数? 除了大多数答案之外,所有使用的方法都只重复了一个字符,例如 String Constructor 和 insert 方法,它们没有回答原始问题并且当我寻找一种有效的方法时没有帮助。

4

2 回答 2

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;
}    
于 2013-06-28T17:24:03.403 回答
1

A simple loop would do. If you are concerned about re-allocations, you can call std::string::reserve on the copy string:

#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;
}
于 2013-06-28T17:20:25.093 回答