当前位置: 首页 > 知识库问答 >
问题:

'->'运算符是如何工作的,修改一个大字符串是一个好的实现吗?

丁学
2023-03-14

我想首先说,我以前使用过指针,我假设我理解它们是如何工作的。如在,

int x = 5;
int *y = &x;
*y = 3;
std::cout << x; // Would output 3

但是,我想制作一个方法来修改一个相当大的字符串,因此,我认为最好是传递一个对字符串的引用,以避免将整个字符串传递回第四个。因此,我将字符串传递给myfunc(),并执行与上面处理数字相同的操作。这意味着我可以像在下面的代码中那样修改*str。但是为了使用string的方法,我需要使用->运算符。

#include <iostream>
#include <string>


int myFunc(std::string *str) { // Retrieve the address to which str will point to.

    *str = "String from myFunc"; // This is how I would normally change the value of myString
    str->replace(0, 1, "s"); // Replacing index 0 with a lowercase s.
    return 0; 
}


int main() {

    std::string myString << "String from main";
    myFunc(&myString); // Pass address of myString to myFunc()

}

我的问题是:

  • 既然myFunc中的str是一个地址,那么为什么一个地址可以使用诸如->这样的运算符,它是如何工作的呢?是不是像使用地址str的方法处的对象一样简单?字符串->replace();//str->MyString.Replace()?
  • 这是修改大字符串的好实现吗?还是将字符串传递给方法并在修改后返回字符串更好??

共有2个答案

朱欣荣
2023-03-14

str是指向std::string对象的指针。箭头运算符->用于取消指针的引用,然后访问其成员。或者,您也可以编写(*str).replace(0,1,“s”)。这里*取消引用指针,然后.访问的成员函数replace()

指针常常令人困惑,最好在可能的情况下使用引用。

void myFunc(std::string &str) { // Retrieve the address to which str will point to.

    str = "String from myFunc"; // This is how I would normally change the value of myString
    str.replace(0, 1, "s"); // Replacing index 0 with a lowercase s. 
}

int main() {

    std::string myString = "String from main";
    myFunc(myString); // Pass address of myString to myFunc()

}

这是修改大字符串的一个好实现吗?还是将字符串传递给方法并在其修改后返回字符串更好??

如果您不想更改原始字符串,那么创建新字符串并返回它。

如果您的应用程序可以修改原始字符串,那么就进行修改。此外,如果需要链接函数调用,还可以返回对修改后的字符串的引用。

std::string& myFunc(std::string &str) { // Retrieve the address to which str will point to.

    str = "String from myFunc"; // This is how I would normally change the value of myString

    return str.replace(0, 1, "s"); // Replacing index 0 with a lowercase s.
    
}
池阳伯
2023-03-14

ptr->x(*ptr).x相同,除非->被您要取消引用的类型重写。在普通指针上,它的工作方式与您所期望的一样。

至于实现,当您实现它时,对它进行分析。您无法知道一旦您打开优化,编译器将对此执行什么操作。例如,如果给定的函数被内联,您甚至不会有任何额外的间接在第一个地方,这将无关紧要的方式,你做它。只要不分配新字符串,差异一般应该可以忽略不计。

 类似资料:
  • 例如: 字符串1=helloworld字符串2=asdfuvjerhelloworld 这应该是真的。 另一个例子:字符串1=helloworld字符串2=lshewodxzr 这也应该是真的。 所以我正在研究如何创建一个方法,它将返回一个布尔值,检查第二个字符串是否包含第一个字符串中的字母。在第二个示例中,string2只有一次字母l,尽管字母l在string1中出现了三次,但仍然返回true。

  • rank ▲ ✰ vote url 41 487 108 705 url 检查一个字符串是否是一个数字 如果一个字符串可以被看做一个数字那么有什么好的方法可以检测出来? 我能想到的方法: def is_number(s): try: float(s) return True except ValueError: return Fals

  • 问题内容: if var is ‘stringone’ or ‘stringtwo’: dosomething() 这行不通!我有一个变量,当它是两个值中的一个时,我需要它执行某些操作,但它不会输入if语句。在Java中工作。如何用Python编写? 问题答案: 这不能满足您的期望: 它与: 始终为真,因为它被认为是“真”值。 有两种选择: 或者您可以编写单独的相等性测试, 不要使用,因为比较对象

  • 问题内容: 我是Java的新手,为了实践起见,我试图创建一个十六进制到十进制的数字转换器,因为我已经成功地制作了一个二进制到十进制的转换器。 我遇到的问题基本上是将一个字符串中的给定字符与另一个字符串进行比较。这就是我定义要比较的当前字符的方式: 这是我尝试比较角色的方法: 当我尝试通过仅输入数字(例如12)来运行代码时,它可以工作,但是当我尝试使用“ b”时,会出现一个奇怪的错误。这是运行程序的

  • 问题内容: 在Java中,有没有一种方法可以确定字符串的第一个字符是否为数字? 一种方法是 并一直执行到9点,但这似乎效率很低。 问题答案: 请注意,这将允许使用 任何 Unicode数字 ,而不仅仅是0-9。您可能更喜欢: 或较慢的正则表达式解决方案: 但是,使用这些方法中的任何一种,必须首先确保该字符串不为空。如果是,而且将引发。没有这个问题。 要使整个条件只占一行,并避免长度检查,可以将正则

  • 问题内容: 在代码中检查的子字符串是: 但是我该如何在Swift中做到这一点? 问题答案: 您可以使用Swift进行完全相同的调用: Swift 4和Swift 5 在Swift 4中,String是值的集合,在Swift 2和3中并不是这样,因此您可以使用以下更简洁的代码1: 迅捷3.0+ 较早的斯威夫特 我希望这是一个有用的解决方案,因为包括我在内的某些人通过致电遇到了一些奇怪的问题。1个 P

  • 在中,检查中的子字符串的代码是: 但我如何在Swift中做到这一点呢?

  • 我想解析一个字符串,看看它是匹配整个字符串还是子字符串。我试过这个: 但我的问题是: