在编写Java多年之后,我想再次更深入地研究C ++。
尽管我认为我可以处理,但我不知道我是否以“最先进的”方式处理它。
目前,我尝试了解如何处理作为常量指针传递给方法的参数的std :: strings。
根据我的理解,我无法对指针内容(实际的字符串)执行任何字符串操作,因为它是常量。
我有一个方法应该将给定的字符串转换为小写,并且为了使给定的字符串可编辑,我做了大量工作(我相信)。看看:
class Util
{
public:
static std::string toLower(const std::string& word)
{
// in order to make a modifiable string from the const parameter
// copy into char array and then instantiate new sdt::string
int length = word.length();
char workingBuffer[length];
word.copy(workingBuffer, length, 0);
// create modifiable string
std::string str(workingBuffer, length);
std::cout << str << std::endl;
// string to lower case (include <algorithm> for this!!!!)
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
std::cout << str << std::endl;
return str;
}
};
尤其是第一部分,我使用char缓冲区将给定的字符串复制到可修改的字符串中,这使我很烦。 有更好的方法来实现这一点吗?
关于, 迈克
答案 0 :(得分:6)
参数为const
(它的引用不是指针!),但这并不妨碍您复制它:
// create modifiable string
std::string str = word;
话虽这么说,为什么首先要将参数设为const
引用?使用const
引用可以避免参数被复制,但是如果您仍然需要复制,则只需复制一个即可。
std::string toLower(std::string word) {
std::transform(word.begin(), word.end(), word.begin(), ::tolower);
// ....
请记住,C ++不是Java,值是值,不是引用,即副本是真实副本,在函数内部修改word
不会对传递给函数的参数产生任何影响。
答案 1 :(得分:2)
您应该替换所有这些内容:
std::string str(word);
简单地说:
{{1}}
它应该可以正常工作=)
答案 2 :(得分:0)
由于必须复制输入字符串,因此最好按值进行输入(与使用col2
成员的类相比,最好使用名称空间)
static
将namespace util {
// modifies the input string (taken by reference), then returns a reference to
// the modified string
inline std::string&convert_to_lower(std::string&str)
{
for(auto&c : str)
c = std::tolower(static_cast<unsigned char>(c));
return str;
}
// returns a modified version of the input string, taken by value such that
// the passed string at the caller remains unaltered
inline std::string to_lower(std::string str)
{
// str is a (deep) copy of the string provided by caller
convert_to_lower(str);
// return-value optimisation ensures that no deep copy is made upon return
return str;
}
}
std::string str = "Hello";
auto str1 = util::to_lower(str);
std::cout << str << ", " << str1 << std::endl;
未经修改地留下:它会打印
str
请参阅here,了解为什么我强制使用Hello, hello
。