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