【发布时间】:2021-05-10 11:34:14
【问题描述】:
我的程序接受一个向量std::vector<std::string> vector 和一个字符char separator 并返回一个字符串,其中所有字符串在分隔符之间加在一起。概念是:vector[0] + separator + vector[1] + separator
守则
std::string VectorToString(std::vector<std::string> vector, char separator)
{
std::string output;
for(std::string segment : vector)
{
std::string separator_string(&separator);
output += segment + separator_string;
}
return output;
}
int main()
{
std::vector<std::string> vector = {"Hello", "my", "beautiful", "people"};
std::cout << VectorToString(vector, ' ');
}
我的预期输出是Hello my beautiful people
但是输出是:
Hello �����my �����beautiful �����people �����
我发现这个字符有问题,特别是它的指针:std::cout << &separator; -> �ƚ��。但是,如果我这样做:std::cout << (void*) &separator; -> 0x7ffee16d35f7。虽然我真的不知道(void*) 做了什么。
问题:
1.发生了什么?
2.为什么会这样?
3.如何解决?
4.如何防止它在未来的项目中发生?
【问题讨论】:
-
...这没有解释为什么它是未定义的行为...
-
这并没有解决问题,但是每次通过循环创建
separator_string对象会浪费时间。在循环之前创建一次。或者,更好的是,根本不创建它。只需将字符附加到字符串:output += segment; output += separator;。 (是的,字符串对象知道如何附加单个字符)对于循环,创建对每个字符串的引用而不是复制:for (const std::string& segment : vector)。 -
@PeteBecker 为什么我应该使用引用而不是复制。是更快还是有其他原因?
-
@ViktorSkarve -- 它更快,使用更少的资源。对于像这样的简单程序并不重要,但是当您进入更复杂的程序时,它可以在速度和内存使用方面产生很大的不同。它可以在成功运行和内存不足之间产生差异。一般来说,使用
const引用而不是复制大的东西是一个好习惯。这就是为什么这么多函数需要const std::string&。
标签: c++ string c++11 char undefined-behavior