2016-08-11 33 views
3

我使用std :: copy时遇到了一些奇怪的行为。随着C + + std ::复制结果不同于字符串构造函数

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

+8

的'copy'写出strID'的'界('copy'不调整目的地) 。您可以使用'std :: back_inserter(strID)'作为第三个参数 –

+2

@ M.M:将其写为答案,然后OP可以接受它,而我们其余的人都可以使用它。 –

+0

别人可以把它写出来,我已经有足够的代表 –

回答

5

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

该问题可以是固定的,例如,通过使用一个目的地迭代生长所述靶序列:

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

正如@ M.M说: 副本写出的strID界(copy不调整目标)。您可以使用std::back_inserter(strID)作为第三个参数。 std::back_inserter