c++ std::复制结果不同于字符串构造函数

C++ std::copy result different from string constructor

本文关键字:字符串 构造函数 不同于 复制 std c++ 结果      更新时间:2023-10-16

我在使用std::copy时遇到了一些奇怪的行为。

std::vector<std::string> chosenIDs{...};
for (const auto& x : chosenIDs) {
  std::string strID("");
  std::copy(std::begin(x), std::find(std::begin(x), std::end(x), '.'), std::begin(strID));
  std::cout << strID << "n";
}

strID字符串包含不应该包含的字符,但是

std::vector<std::string> chosenIDs{...};
for (const auto& x : chosenIDs) {
  std::string strID(std::begin(x), std::find(std::begin(x), std::end(x), '.'));     
  std::cout << strID << "n";
}

工作完全正常。我很清楚,我应该使用第二种方法,但它仍然困扰着我,为什么第一个代码片段中的行为与第二个代码片段不同。

我使用的是GCC 5.4.0

当使用std::copy()时,有必要确保两个范围都不进行越界访问。目标范围开始是空的,并且没有做任何事情来扩展它。因此,结果是未定义的行为。

这个问题可以修复,例如,通过使用目标迭代器来增长目标序列:

std::copy(std::begin(x), std::end(x),
            std::back_inserter(strID));

M说:副本写越界strID (copy不调整目标大小)。您可以使用std::back_inserter(strID)作为第三个参数。std:: back_inserter