如何在C++中传递子字符串而不实际创建临时对象

4
假设我有一个函数:
str_rev(string &s, int len) {}

该函数是用于反转长度为len的字符串s

我想要反转一个长字符串的子串,该子串从索引5开始,长度为10

为此,我被迫先调用substring函数,然后调用str_rev函数并将子串作为参数传递

sub_string = long_str.substr(5, 10)
str_rev(sub_string, 10);

有没有不需要创建临时对象就能实现这个的方法?

2
除了不使用迭代器/std::reverse,为什么你原来的函数需要带上大小参数? - GManNickG
4个回答

8

让您的函数接受迭代器(或者更好的方法是使用 std::reverse()),并传入限定子字符串的迭代器。


3
也许你只是想做这件事:
std::string::iterator it = long_str.begin() + 5;
std::reverse(it, it+10);

嗯...我想知道为什么没有reverse_n。有人知道是否有充分的理由吗? - Benjamin Lindley
@Eugen:我不明白,一个如何避免另一个? - Benjamin Lindley
@PigBen:因为没有必要。只需将“n”添加到您的起始迭代器即可。 - GManNickG
@GMan:但这只适用于随机访问迭代器。不过,我刚想到可能的原因。这是因为reverse需要从两侧迭代,所以需要一个有效的最后迭代器从开始迭代。而像copy、generate和fill这样的函数可以使用插入迭代器在途中创建元素。 - Benjamin Lindley
@PigBen:你可以使用std::advance。但是,没错,我希望你会问“为什么有fill_n呢?”但是你已经想通了。 :) - GManNickG
@PigBen:哎呀,我在想其他的事情...删掉了无用的评论... - Eugen Constantin Dinca

2

不要使用int len,而是传递一个定义范围的参数:

str_rev(string &s, const t_unsigned_range& range) {/* ... */}

并且

str_rev(long_str, t_unsigned_range(5,10));

1

如果您使用char*而不是std::string,那么您可以传递指向字符串中任意两个字符的指针。然而,通常情况下使用char*并不是一个好主意。


你的意思是迭代器,就像sbi建议的那样。 - GManNickG
不,我是指指针。我不知道你可以为 std::string 的单个字符拥有迭代器。谢谢你提供新的见解。 - Baruch
说“我不是指迭代器,我是指指针”是没有意义的。指针本身就是一种随机访问迭代器。 - sbi
我知道这一点。我的意思是我不知道你可以在std :: string的字符上使用随机访问迭代器。我认为为了使用指向单个字符的指针,必须使用char *,因此指针(即使它们可以用作迭代器的替代品,在这种情况下它们仍然是技术上的指针)。 - Baruch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接