C++ std::对c样式的字符串进行排序,而不复制该字符串
我遇到了一个奇怪的、非常具体的问题。作为一些背景,我需要支持一些传递大量大型c风格字符串的遗留代码。由于这些数据非常庞大,我希望避免不必要地复制这些数据,这将包括仅为一个操作复制构造std::stringsC++ std::对c样式的字符串进行排序,而不复制该字符串,c++,c,string,C++,C,String,我遇到了一个奇怪的、非常具体的问题。作为一些背景,我需要支持一些传递大量大型c风格字符串的遗留代码。由于这些数据非常庞大,我希望避免不必要地复制这些数据,这将包括仅为一个操作复制构造std::strings 我想对这些字符串使用std::sort,但它们显然缺少迭代器。然而,根据std::sort的文档,我应该能够为任何连续的随机访问内存传入两个指针,但它不能处理我的c样式字符串 基本上是这样的: char* foo = "test string"; std::sort(foo, foo + 1
我想对这些字符串使用std::sort,但它们显然缺少迭代器。然而,根据std::sort的文档,我应该能够为任何连续的随机访问内存传入两个指针,但它不能处理我的c样式字符串 基本上是这样的:
char* foo = "test string";
std::sort(foo, foo + 11); // access violation occurs
然而:
char foo[] = "test string";
std::sort(foo, foo + 11); // perfect fine, sorted correctly
这让我特别困惑,因为据我所知,char*和char[]本质上是相同的。为什么char*会中断,而char[]会成功?如何将c样式的字符串传递到STL算法中
char* foo = "test string";
这是指向存储在只读内存中的字符串文本的指针,因此无法对其进行修改/排序
您的代码应该向您发出警告,类似于:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
main.cpp:3:17: warning: conversion from string literal to 'char *' is deprecated
[-Wc++11-compat-deprecated-writable-strings]
char* foo = "test string";
^
请阅读: 这是指向存储在只读内存中的字符串文本的指针,因此无法对其进行修改/排序
您的代码应该向您发出警告,类似于:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
main.cpp:3:17: warning: conversion from string literal to 'char *' is deprecated
[-Wc++11-compat-deprecated-writable-strings]
char* foo = "test string";
^
请阅读:这是因为文本
“测试字符串”
是只读的。char*foo=“测试字符串”代码>应该给你一个编译警告/错误。“但是他们显然缺少迭代器”。。。指针显然是迭代器,“因为据我所知,char和char[]本质上是相同的。”*不完全一样。而且,这对谷歌来说并不难。请在询问之前做一些研究。这是因为文本“test string”
是只读的。char*foo=“test string”代码>应该给你一个编译警告/错误。“但是他们显然缺少迭代器”。。。指针显然是迭代器,“因为据我所知,char和char[]本质上是相同的。”*不完全一样。而且,这对谷歌来说并不难。请在询问之前做些调查。