Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字符数组/字符串复制到C++; 问题: 在C++中:给定了STD::String s=“COMPYSE”,我怎样才能生成一个字符串“B”,它是“CopyCopyMeCopyMe”或任何广义S+S+…n次 可能的解决方案_C++_String_String Concatenation - Fatal编程技术网

如何将字符数组/字符串复制到C++; 问题: 在C++中:给定了STD::String s=“COMPYSE”,我怎样才能生成一个字符串“B”,它是“CopyCopyMeCopyMe”或任何广义S+S+…n次 可能的解决方案

如何将字符数组/字符串复制到C++; 问题: 在C++中:给定了STD::String s=“COMPYSE”,我怎样才能生成一个字符串“B”,它是“CopyCopyMeCopyMe”或任何广义S+S+…n次 可能的解决方案,c++,string,string-concatenation,C++,String,String Concatenation,一个可能的解决方案是一个执行for循环的方法/宏,但这将是非常低效的 什么是执行此字符串复制操作的有效方法,例如,正如前一位作者在python或ruby中以“string”*n的样式所说的那样 一个相对有效的循环是分配strlen*n,然后多次复制字符,而不是(…){str+=copy_this_string;}进行多次复制和分配 另一种解决方案是使用stringbuffer 因此,澄清 键:不使用宏。 澄清:问题中的“字符数组”是因为在原始问题中,由于字符串中只有一个字符,所有答案都忽略了对

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

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

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

另一种解决方案是使用stringbuffer


因此,澄清 键:不使用宏。 澄清:问题中的“字符数组”是因为在原始问题中,由于字符串中只有一个字符,所有答案都忽略了对一般流的复制,而将重点放在使用“.”上,因为它具有易于访问的方法,如流构造函数

“重复”:
除了大多数答案外,所有使用的方法都只重复了一个字符,例如字符串构造函数和插入方法,它们没有回答最初的问题,在我寻找一个有效的方法时也没有帮助。

一个简单的循环就可以了。如果您担心重新分配,可以在复制字符串上调用
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;
}
#包括
#包括
int main()
{
常量int num+5;
std::string s=“copyme”;
std::字符串b;
b、 reserve(s.size()*num);//为num*“copyme”保留空间
对于(inti=0;istd::cout如果您担心字符串“+=”操作效率低下,您可以进行的一个优化是在目标字符串容器中保留内存。这可以避免内存的低效重新分配。
例如:

std::string s = "copyme";
std::string b;
target.reserve(s.length()*5);
for (int index = 0; index < 5; ++index)
{
    b += s;
}
std::string s=“copyme”;
std::字符串b;
目标.储备(s.长度()*5);
对于(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;
}    
模板
基本字符串&
基本字符串::
追加(常量基本字符串和字符串)
{
常量大小\类型\大小=\字符串大小();
如果(大小)
{
常量大小\类型\长度=\大小+此->大小();
如果(__len>this->capacity()| | _M_rep()->_M_is_shared())
此->保留(uu_len);
_M_copy(_M_data()+此->大小(),_M_str._M_data(),_大小);
_M_rep()->u M_set_length_和_sharable(u len);
}
归还*这个;
}    

一个循环怎么会是低效的?否则它怎么可能被实现呢?当每个人都给了你实际的答案而不是你所希望的答案时,不要生气。关于你最近的编辑-你真的认为
'string'*n
在它的实现中不是一个循环吗?你们两个都使用+=。告诉我这是什么时候有效的我会投票支持你的答案。@CaptainSkyhawk+=已经足够好了。你在刮牦牛的胡子。@EiyrioüvonKauyf后端阵列是什么?请清楚地说明你的要求。用于复制到它而不是从它复制。但这是更有效的,因为它减少了+1的分配。