2013-04-23 88 views
1

让我通过代码问我的问题:在指定POS复制的char *到的std :: string不分配新的对象

char* apples = "apples"; 
std::string str("I like ....."); 
// need to copy apples to str to have "I like apples", without creating new objects 

assign功能,但遗憾的是它似乎是不可能提供std::string offset

我不想分配新的对象,因为这是低延迟并且经常是代码的一部分。

upd错误我已经把5点以上,但我的意思是6点,以适应“苹果”完美:)当然,如果字符串容量不够,一些对象必须创建。在我的问题中,我认为字符串容量就足够了。

+0

你想做什么?覆盖字符串的尾巴,就像在我的回答中,或者将任意字符串追加到你的? – kassak 2013-04-23 07:37:57

+0

以及我需要覆盖“....”。但是追加也会起作用。我可以'调整大小'原始字符串切割'...'然后附加... – javapowered 2013-04-23 07:40:03

+0

您是否打算在字符串中有六个点,以便可以在不调整字符串的情况下用“苹果”覆盖它们?事实上,如果要用六个字母替换五个点,字符串将需要增长。 – 2013-04-23 07:51:24

回答

1

为什么不使用std::string::replace

+0

如果它的工作,那么问题是什么更好'std :: copy'或'std :: string :: replace' – javapowered 2013-04-23 07:43:21

+0

@javapowered他们不会做同样的事情。 – 2013-04-23 07:46:30

+0

@javapowered:'replace'确实(我想)你想要什么,即使它们有不同的长度,用另一个字符串替换子字符串。 'copy'会覆盖部分字符串,并且如果字符串不够长(在你的例子中就是这种情况),会出现可怕的错误。 – 2013-04-23 07:48:57

5

您可以使用std::copy算法http://www.cplusplus.com/reference/algorithm/copy/

std::copy(apples, apples + sz, str.begin() + offset);

+0

OP所要做的是在不复制的情况下添加字符串,这是不可能的。 – 2013-04-23 07:35:15

+0

@IvayloStrandjev我想,他在谈论重写字符串的尾巴。我会问他澄清=) – kassak 2013-04-23 07:36:30

+0

@IvayloStrandjev我不想介绍“中间”的对象。例如我不想将'char * apples'转换为中间'std :: string'。相反,我想直接将字符串复制到'str',但我需要提供位置。我认为卡斯克回答了我的问题。 – javapowered 2013-04-23 07:41:49

1

甚至可以指定将复制无论你传递给它的内容。你将无法做你想做的事。一个字符串持有一个指向内存中的字符块的连续的块。你不能把任意事情粘到它上面。

+0

我可以'复制'!这就是我想要做的。好吧,我的问题似乎太简单了,我迷惑了人们。我想我应该使用'replace'。 – javapowered 2013-04-23 07:48:01

+1

@perreal它取决于。首先,标准对'std :: string'不做任何保证;一个符合的实现可以在任何时候调用一个非const函数来进行重新分配。如果您需要保证,请使用'std :: vector '。其次,至少在大多数情况下,我所见过的所有实现行为或多或少都像'std :: vector '。 (例如,如果你在非常量字符串上使用'[]',g ++可能会重新分配,但是只有第一次;在此之后,在容量超过之前不会再进行重新分配。) – 2013-04-23 07:49:52

+0

@JamesKanze,非常丰富 – perreal 2013-04-23 07:51:04

0

使用std::copy()算法的答案是AFAIK中最好的一个。你也可以使用普通的老C(你知道,它实际上不是C,空调风格将是一个更好的名字)来实现同样的事情:

char* apples = "apples"; 
std::string str("I like ....."); 

char * ptr = apples; 
while(*ptr != 0) { 
    str.push_back(*ptr); 
    ++ptr; 
} 

正如你所看到的,有没有临时对象在这里创建,但是......这是否意味着在这个过程中没有分配?他们确实是。

A std::string基本上是一个字符向量。该字符串有一个capacity()方法,该方法返回可以追加多少额外字符而不触发另一个分配(可能涉及重新分配,从而复制整个向量)。为了避免分配,你可以做的最好的做法是确保字符串有足够的空间供所有字符插入。

char* apples = "apples"; 
std::string str("I like ....."); 

str.reserve(str.length() + strlen(apples)); 

char * ptr = apples; 
while(*ptr != 0) { 
    str.push_back(*ptr); 
    ++ptr; 
} 

这种方式可以确保将只有在std::string一个分配:一个与reserve()触发。

希望这会有所帮助。

0
char * apples = "apples"; 
string something = "I like ...."; 
    for (int i = 0; i < something.length() - 1; i++) 
    { 
     if (something.find('.')) 
      something.pop_back(); 
    } 
    something.resize(something.length() + 1); 
    for (int i = 0; i < strlen(apples); i++) 
     something.push_back(apples[i]); 
cout << something <<endl; 
相关问题