C ++ std :: copy结果与字符串构造函数不同

时间:2016-08-11 07:12:22

标签: c++

使用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

2 个答案:

答案 0 :(得分:5)

使用class BatchItemsViewModel : ViewModelBase { public SearchItemsModel msearchItems { get; set; } ObservableCollection<SearchItemsModel> _BatchItemsGrid; public ObservableCollection<SearchItemsModel> BatchItemsGrid { get { return _BatchItemsGrid; } set { _BatchItemsGrid = value; OnPropertyChanged("BatchItemsGrid"); } } private ICommand _addDataToBatchGrid; public ICommand addDataToBatchGrid { get { return _addDataToBatchGrid; } set { _addDataToBatchGrid = value; } } public BatchItemsViewModel() { msearchItems = new SearchItemsModel(); addDataToBatchGrid = new RelayCommand(new Action<object>(AddDataInBatchGrid)); } public void AddDataInBatchGrid(object obj) { ObservableCollection<SearchItemsModel> batchGridData = new ObservableCollection<SearchItemsModel>(); var data = new SearchItemsModel { BatchNumber = msearchItems.BatchNumber, MFDDate = msearchItems.MFDDate, ExpiryDate = msearchItems.ExpiryDate, Quantity = msearchItems.Quantity, }; batchGridData.Add(data); BatchItemsGrid = batchGridData; // HERE I am overwriting the datagrid //How can I Append the batchGridData to BatchItemsGrid (BatchItemsGrid.Append(batchGridData)???) } } 时,必须确保两个范围都不会超出边界访问范围。目标范围从空开始,并且没有做任何事情来扩展它。因此,结果是未定义的行为。

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

std::copy()

答案 1 :(得分:3)

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