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 风格的字符串进行排序,而不复制字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 使用 std::sort 对结构向量进行排序导致读取访问冲突

使用 std::sort 对对象向量进行排序

使用 std::sort 对具有特定标准的二维向量进行排序

使用 std::sort() 对对象向量进行排序

如何使用 std::sort() 对指向值的向量进行排序?

使用 std::sort 对包含两个数据成员的对象向量进行排序