【问题标题】:How can I get C++ string functions to behave like Java and C# string methods?如何让 C++ 字符串函数表现得像 Java 和 C# 字符串方法?
【发布时间】:2013-03-28 19:59:57
【问题描述】:

我开始从具有 Java 和 C# 知识的一般编程背景中学习一些 C++。我正在处理一些字符串,我对一些字符串函数感到沮丧。我习惯于字符串函数返回一个新字符串,而旧字符串保持不变。我知道这是在 C# 和 Java 中完成的,因为字符串是不可变的,但我真的希望 C++ 中的字符串方法也能以这种方式工作。有什么我想念的吗?现在我正在做这样的事情:

std::string temp = word;
Func(temp.erase(i , 1));

编辑:这就是我的想法:

Func(word.substr().erase(i , 1);

你们觉得哪一个最好?我想这是一件小事,只是想知道。

【问题讨论】:

  • 这不会抹去什么吗?
  • 是的......你到底想用字符串做什么?
  • 如您所愿,C++ 不是 C#,而且永远不会是。与其尝试将其转换为另一种语言,不如拥抱现有的语言(带有缺陷),并将其视为一个完全独立的实体(因为它是)
  • @Ben313:好的,但要意识到你最近的陈述与标题和你问题中的几乎每一句话都矛盾。
  • Func(std::string(word).erase(i, 1));

标签: c++ string


【解决方案1】:

只要你想要一个副本,就明确声明它:

std::string copy = original;
copy.erase(startPos, size);

当您实际上不需要副本时不断复制字符串是对性能的浪费,而 C++ 被设计为具有极高的性能,因此大型程序(如游戏、办公套件或 Web 浏览器)即使在旧版本上也能顺利运行硬件。

为了满足这一非常重要的需求,C++ 的座右铭是“不要为不需要的东西买单”,整个语言都是围绕着这一点设计的。

这并不意味着其他语言(如 Java)更差或更好,只是它们服务于不同的目的和不同的需求,因此功能不同。 Java 的主要目的是“随时随地运行相同的可执行文件”(字面意思是:“write once, run everywhere”),这就是它存在于虚拟机上的原因,也是 Java 的原因代码适用于 10 美元的手机、1000 美元的智能手机、电视、电脑、网络浏览器和您的微波炉。

【讨论】:

    【解决方案2】:

    在 C++ 中,您有两种可能性:“就地”编辑,或者返回一个新字符串,例如,您可以使用 substr

    好的,我明白了。一个变种:

    Func( string(word).erase(i,1) );
    

    【讨论】:

    • 这就是我要找的。不知道我是否应该使用它。
    • 当你真正需要一个副本时使用它是可以接受的(即使是你传递给函数的临时副本),但默认情况下,你应该修改原始文件,特别是如果你使用相同的成员 -函数(如 erase)多次使用相同的参数。
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2020-04-17
    • 2013-04-13
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2012-04-23
    相关资源
    最近更新 更多