std :: sort在一个c风格的字符串上,不复制字符串

时间:2017-04-14 18:50:27

标签: c++ c string

我遇到了一个奇怪的,非常具体的问题。作为一些背景知识,我需要支持一些遗留在很多大型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算法?

1 个答案:

答案 0 :(得分:4)

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";
                ^

请阅读:What is the difference between char s[] and char *s?