写入std :: string是否合法?

Art*_*yom 14 c++ string standards

在std :: string中,只有const成员来获取数据,如c_str().但是我可以获得对字符串via的第一个元素的引用operator[],我可以写入它.

例如,如果我有功能:

void toupper(char *first,char *last_plus_one);
Run Code Online (Sandbox Code Playgroud)

我可以直接写向量获取指向第一个元素的指针:

vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

我可以用std :: string做同样的事情吗?

string message="Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

标准是否保证内存的位置实际上是线性的?即:

&(*(message.begin()+n)) == &message[n]
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mic*_*urr 22

Herb Sutter有这个说法(http://herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/#comment-483):

当前的ISO C++确实需要&str [0]来连接一个指向连续字符串数据的指针(但不一定是空终止的!),所以实现者没有太多的余地来拥有非连续的字符串.对于C++ 0x,我们已经采用了保证std :: string内容必须连续存储.有关详细信息,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530

马特·奥斯特恩在参考文献中说过类似的内容(http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530).

因此,似乎您可以假设一旦调用str [0],您就会获得一个可修改的字符数组(但请注意,它不需要以null结尾).


CTT*_*CTT 17

std :: string将需要具有新的c ++ 0x标准的连续存储.目前这是未定义的行为.

  • 为什么你甚至担心这些问题.使用迭代器,所有问题都消失了! (8认同)
  • 是否有已知的编译器使用不连续的字符串?IE我可以在99%的情况下联系(可能只是针对特定编译器进行解决以防止复制开销) (7认同)
  • 我一直认为有一个编译器/库对这些类型的东西(过度)迂腐是"整洁的".它会以坚持/低效/意外的方式做事,同时仍然是合规的. (6认同)
  • 我似乎记得委员会成员(Sutter,很可能)感到惊讶的是,标准品不要求字符串连续存储.他们意味着有这个要求,它将在下一个标准中,我不知道任何没有连续字符串存储的实现. (2认同)

Mar*_*ork 5

是的,你可以修改一个字符串.

您也可以在使用迭代器的算法中使用它.

您不能以与矢量<>相同的方式使用它,因为无法保证元素位于连续的内存位置(但是:很快就会到达您附近的标准).

因此,如果您修改使用迭代器而不是指针的方法,它应该工作.并且因为迭代器的行为与指针非常相似,所以代码更改应该可以忽略不计.

template<typename I>
void toupper(I first,I last_plus_one)
{
    // Probably the same code as you had before.
}


{
     std::string  s("A long string With Camel Case");

     toupper(s.begin(),s.end());
}
Run Code Online (Sandbox Code Playgroud)