C++ std::对c样式的字符串进行排序,而不复制该字符串

C++ 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

我遇到了一个奇怪的、非常具体的问题。作为一些背景,我需要支持一些传递大量大型c风格字符串的遗留代码。由于这些数据非常庞大,我希望避免不必要地复制这些数据,这将包括仅为一个操作复制构造std::strings


我想对这些字符串使用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[]本质上是相同的。”*不完全一样。而且,这对谷歌来说并不难。请在询问之前做些调查。