std::sort 对 c 风格的字符串进行排序,而不复制字符串 [重复]
Posted
技术标签:
【中文标题】std::sort 对 c 风格的字符串进行排序,而不复制字符串 [重复]【英文标题】:std::sort on a c-style string, without copying the string [duplicate] 【发布时间】:2017-04-14 18:50:26 【问题描述】:我遇到了一个奇怪且非常具体的问题。作为一些背景,我需要支持一些遗留代码,这些代码传递了大量的大型 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 算法?
【问题讨论】:
那是因为"test string"
是只读的。
char* foo = "test string";
应该给你一个编译警告/错误。
"但它们显然缺少迭代器" ...指针显然是迭代器
“因为据我所知,char 和 char[] 本质上是一样的。”* 不是,不是。
另外,谷歌搜索并不难。请在询问之前做一些研究。
【参考方案1】:
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?
【讨论】:
以上是关于std::sort 对 c 风格的字符串进行排序,而不复制字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章