1

让我通过代码问我的问题:

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

分配功能,但不幸的是似乎无法提供std::string offset

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

upd错误地我在上面放了 5 个点,但我的意思是 6 个点完全适合“苹果”:) 当然,如果字符串容量不够,必须创建一些对象。在我的问题中,我假设字符串容量就足够了。

4

5 回答 5

5

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

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

于 2013-04-23T07:34:24.510 回答
1

即使 assign 会复制你传递给它的任何内容。你将无法做你想做的事。字符串包含指向内存中连续字符块的指针。你不能只是把任意的东西粘到它上面。

于 2013-04-23T07:34:40.800 回答
1

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

于 2013-04-23T07:41:30.217 回答
0

使用std::copy()算法的答案是最好的 AFAIK。你也可以使用普通的旧 C(你明白,它实际上不是 C,C 风格会是一个更好的名字)来实现同样的事情:

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

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

如您所见,这里没有创建临时对象,但是……这是否意味着该过程中没有分配?他们确实是。

Astd::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()

希望这可以帮助。

于 2013-04-23T07:44:53.087 回答
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;
于 2013-04-23T08:28:13.790 回答