2016-08-11 59 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