我在这里是新的,这是我的第一个问题。Initializer_list作为函数参数和循环功能
所以,我有这样的功能:
std::string join(string_initializer_list p_input) const {
std::string output;
for (auto const & s : p_input) {
output.append(s);
}
return output;
}
该功能的主要目的是参加字符串返回一个新的字符串列表。
对于参数我使用了std::initializer_list<std::string>
别名为string_initializer_list
。
该参数是按值传递的,因为在做了一些研究之后,我注意到我只是传递指针而已,这是最习惯和正确的方式。
我的问题与for循环有关:在这种情况下哪个更正确?为什么?我应该使用auto const &
还是auto &&
?
问题是:我不想更改initializer_list
中的任何字符串,我想清楚地说明。从这个角度来看,const &
似乎更正确,但我想知道你对这件事的看法。
在做了一些研究后,用C++进行测试并阅读了很多问题,但我还没有完全理解auto &&
的工作原理。
此外,在第一份草案中,我还将参数作为&&
传递,以防止它成为左值。
我只打算使用此功能快速这样的东西:
join({"Hello, ", "world"});
在极少数ocasions,其中一个std::string
S的最终会被一个左:
join({"Hello, ", some_string});
主要概念这里是制作串联字符串的便宜而简单的方法。这是我做的另一个功能,与上面的类似,但是用于不同的上下文。
std::string & concatenate(std::string & p_output, string_initializer_list p_input) const {
for (auto const & s : p_input) {
p_output.append(s);
}
return p_output;
}
再一次,我的完美主义者问的是循环。
你可能想在你的函数中考虑几件事情。一种可能是你可能首先要计算长度的总和,然后在填充之前构造一个大小的字符串。至于循环。因为底层对象类型的类型是const字符串,因此对于通用引用的类型推导应该产生const字符串,并且与const auto&would相同,因此在事务的大方案中使用const auto&或auto &&并不重要。 (更有效的函数可能实际上是使用可变参数模板来完成工作而不是循环的函数。) – Charlie
谢谢!我是否应该使用另一个循环来计算最终长度,然后在最后一个字符串上调用保留?另一个循环会不会太多?我的意思是,我明白你的观点。我知道可变模板的事情,模板解决方案的问题是,它们应该是通用的,在我的情况下,我只想要一些可以在字符串上工作的东西,还有许多用于字符串连接的可变参数模板实现使用ostringstream来确保大多数东西变成了一个字符串。 –