Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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

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++ 写入std::string合法吗?_C++_String_Standards - Fatal编程技术网

C++ 写入std::string合法吗?

C++ 写入std::string合法吗?,c++,string,standards,C++,String,Standards,在std::string中,只有const成员可以获取数据,比如c_str()。但是,我可以通过操作符[]获得对字符串第一个元素的引用,并可以对其进行写入 例如,如果我有函数: void toupper(char *first,char *last_plus_one); 我可以直接写入vector,获得指向第一个元素的指针: vector<char> message // has "Some Message"; toupper(&message[0],&messag

在std::string中,只有const成员可以获取数据,比如c_str()。但是,我可以通过
操作符[]
获得对字符串第一个元素的引用,并可以对其进行写入

例如,如果我有函数:

void toupper(char *first,char *last_plus_one);
我可以直接写入vector,获得指向第一个元素的指针:

vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());
标准是否保证内存的位置实际上是线性的?即:

&(*(message.begin()+n)) == &message[n]

谢谢。

std::string需要使用新的c++0x标准进行连续存储。目前这是一个未定义的行为。

我认为它给了你一个未定义的行为。使用stringstream进行写入,然后使用str()成员获取流的字符串。

Herb Sutter有这样一句话():

当前ISO C++确实需要和STR(0)来对指向连续的字符串数据的指针(但不一定是null终止)进行指示,因此,实现者没有太多的余地来拥有非连续的字符串。对于C++0x,我们已经采用了std::string内容确实必须连续存储的保证。有关详细信息,请参阅

马特·奥斯特在参考文件()中也说了类似的话


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

是的,您可以修改字符串

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

您不能以与向量相同的方式使用它,因为无法保证元素位于连续的内存位置中(不过:很快就会有一个标准)

因此,如果您修改您的方法以使用迭代器而不是指针,它应该可以工作。由于迭代器的行为非常类似于指针,因此代码更改应该可以忽略不计

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());
}
模板
虚空图珀(我先,我最后加一)
{
//可能与以前的代码相同。
}
{
std::string s(“带驼峰大小写的长字符串”);
toupper(s.begin(),s.end());
}

正如已经指出的,可以在使用迭代器的算法中使用字符串;同样的情况可以使用<代码> STD::Trime
int (*pf)(int)=tolower; //lowercase
std::transform(s.begin(), s.end(), s.begin(), pf); 

关于,

是否有已知的使用非连续字符串的编译器?例如,在99%的情况下,我是否可以与之相关(可能只是为特定的编译器做一些变通,以防止复制开销),我一直认为拥有一个(过度)学究式的编译器/库是“整洁”的。它会以艰难/低效/出乎意料的方式进行操作,同时仍然是兼容的。几乎可以肯定它是连续的-但是std::string还存储了一些东西,比如长度,如果你这样做可能会无效。我似乎记得一位委员(很可能是Sutter)令人惊讶的是,标准并不要求字符串具有连续存储。他们希望有这样的要求,这将出现在下一个标准中,我不知道有任何实现没有连续字符串存储。你为什么还要担心这些问题呢。使用迭代器,所有问题都会消失!!你不能简单地模板化toupper函数,允许使用字符串迭代器而不是指针吗?如果可以,我不会问。想想看,我有一个大型的第三方库,它可能支持unicode或其他东西,而且它们的api可以与指针一起工作。因为将其作为模板实现要花费很多。@jalf:我手头没有标准,但我相信std::to_upper正是您所建议的。实际上,从链接中我看到C++03不需要连续内存,但实际上没有其他实现。我知道最好不要怀疑Sutter,但是有人需要引用&str[0]来生成指向连续数据的指针吗?根据奥斯特恩的说法,通过运算符[]访问需要连续数组,而通过迭代器访问则不需要(因此&str.begin()不会)。我不会和枯萎的萨特或奥斯汀争论,但我仍然没有足够的信心,我把“似乎是”的黄鼠狼词放进去了。好吧,我明白你在说什么,我只是试图找到标准的引用,我认为奥斯特恩和萨特都在暗示至少到C++ 03,string不需要是连续的,但是没有已知的实现有其他的方式。底线是问题中的例子是“未定义的行为”。从库节开始搜索“连续”或“[0]”会直接通过“字符串”节并在“向量”中停止。错误。您可以写入字符串。
int (*pf)(int)=tolower; //lowercase
std::transform(s.begin(), s.end(), s.begin(), pf);