【c++隨筆16】reserve之后,使用std::copy會崩潰?

【c++隨筆16】reserve之后,使用std::copy會崩潰?

  • 一、reserve之后,使用std::copy會崩潰?
  • 二、函數std::reserve、std::resize、std::copy
    • 1、std::resize:
    • 2、std::reserve:
    • 3、std::copy:
  • 三、崩潰原因分析
    • 方案1、你可以使用 std::back_inserter 插入迭代器來向 destination 中插入元素,代碼如下:
    • 方案2、resize將容器大小調整同時,新增的元素將會被默認初始化為0,這樣std::copy中的destination.begin()就可用訪問到元素了

原創作者:鄭同學的筆記
原創地址:https://zhengjunxue.blog.csdn.net/article/details/134272501

一、reserve之后,使用std::copy會崩潰?

先看代碼

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> source = { 1, 2, 3, 4, 5 };std::vector<int> destination;// 在目標vector中預留足夠的空間,避免不必要的重新分配destination.reserve(source.size());// 使用std::copy將source中的元素復制到destination中std::copy(source.begin(), source.end(), destination.begin());// 打印復制后的destination內容for (int num : destination) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

運行,崩潰截圖如下
在這里插入圖片描述

我們先簡單說下std::reserve、std::resize、std::copy三個函數的用法,然后再說崩潰的原因。

二、函數std::reserve、std::resize、std::copy

1、std::resize:

  • std::resize 用于改變容器的大小,并可以指定新元素的初值。
  • 如果新的大小大于當前大小,則在末尾添加新元素;如果新的大小小于當前大小,則刪除多余的元素。
  • 使用 resize 會改變容器內的元素個數,并可能導致元素值的改變。

示例代碼如下:

std::vector<int> vec = {1, 2, 3};
vec.resize(5); // 將容器大小調整為 5,新增的元素將會被默認初始化為0
vec.resize(3); // 將容器大小調整為 3,多余的元素將會被刪除

2、std::reserve:

  • std::reserve 用于預留容器的空間,但不會改變容器的大小。
  • 當你知道容器將要存儲大量元素時,可以使用 reserve 來提前分配足夠的內存,避免容器多次擴張操作。
  • 使用 reserve 不會改變容器中的元素個數,只是預分配了足夠的空間。

示例代碼如下:

std::vector<int> vec;
vec.reserve(100); // 預留至少能容納100個元素的空間

3、std::copy:

template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);

std::copy 用于將一個范圍內的元素復制到另一個范圍,它可以用于將一個容器中的元素復制到另一個容器中

注意事項

  • 確保輸出范圍有足夠的空間來容納被復制的元素,否則可能會導致未定義的行為。
  • 當處理容器時,確保輸出容器有足夠的容量,或者使用插入迭代器(如 std::back_inserter)來確保動態分配足夠的空間。
int source[] = {1, 2, 3, 4, 5};
int destination[5];// 使用 std::copy 將 source 數組的內容復制到 destination 數組
std::copy(std::begin(source), std::end(source), std::begin(destination));

三、崩潰原因分析

  • 在這個代碼中,當你使用 std::copy 將 source 中的元素復制到 destination 中時,會導致程序崩潰的原因是因為 destination 容器的空間雖然預留了,但是其中并沒有實際的元素,所以無法直接通過 destination.begin() 來訪問 destination 的首個元素。

  • 在使用 std::copy 進行復制時,目標容器必須有足夠的空間來容納被復制的元素,并且使用 std::back_inserter 或者確保目標容器大小與源容器相同的方式來進行插入操作。如果目標容器沒有足夠的空間或者沒有正確的插入迭代器,就會導致未定義的行為,可能導致程序崩潰。

要修復這個問題,有兩個方法你可以使用

方案1、你可以使用 std::back_inserter 插入迭代器來向 destination 中插入元素,代碼如下:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> source = { 1, 2, 3, 4, 5 };std::vector<int> destination;// 在目標vector中預留足夠的空間,避免不必要的重新分配destination.reserve(source.size());// 使用std::copy將source中的元素復制到destination中std::copy(source.begin(), source.end(), std::back_inserter(destination));// 打印復制后的destination內容for (int num : destination) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

方案2、resize將容器大小調整同時,新增的元素將會被默認初始化為0,這樣std::copy中的destination.begin()就可用訪問到元素了

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> source = { 1, 2, 3, 4, 5 };std::vector<int> destination;// 在目標vector中預留足夠的空間,避免不必要的重新分配destination.resize(source.size());// 使用std::copy將source中的元素復制到destination中std::copy(source.begin(), source.end(), destination.begin());// 打印復制后的destination內容for (int num : destination) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213168.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習 | Python貝葉斯超參數優化模型答疑

機器學習 | Python貝葉斯超參數優化模型答疑 目錄 機器學習 | Python貝葉斯超參數優化模型答疑問題匯總問題1答疑問題2答疑問題3答疑問題匯總 問題1:想問一下貝葉斯優化是什么? 問題2:為什么使用貝葉斯優化? 問題3:如何實現? 問題1答疑 超參數優化在大多數機器學習流水線…

淺析不同NAND架構的差異與影響

SSD的存儲介質是什么&#xff0c;它就是NAND閃存。那你知道NAND閃存是怎么工作的嗎&#xff1f;其實&#xff0c;它就是由很多個晶體管組成的。這些晶體管里面存儲著電荷&#xff0c;代表著我們的二進制數據&#xff0c;要么是“0”&#xff0c;要么是“1”。NAND閃存原理上是一…

安卓11修改power按鍵功能

客戶需要把power鍵的短按休眠功能去除&#xff0c;并且把長按功能改成直接關機&#xff0c;我們先分析系統framework層處理按鍵的代碼&#xff1a; interceptKeyBeforeQueueing power按鍵上來都會直接走這里&#xff0c;我們找到power按鍵處理的地方如下&#xff1a; case KeyE…

開啟數據庫性能之旅:MSSQL存儲過程索引優化深度解析

數據庫&#xff0c;如同一座龐大的圖書館&#xff0c;蘊藏著無數寶貴的信息。然而&#xff0c;想要在這個海量數據的世界中迅捷而準確地找到所需&#xff0c;索引就成為了至關重要的引路人。本文將引領讀者深入探討MSSQL存儲過程中索引優化的奧妙&#xff0c;揭示數據庫性能提升…

Spring日志完結篇,MyBatis操作數據庫(入門)

目錄 Spring可以對日志進行分目錄打印 日志持久化&#xff08;讓日志進行長期的保存&#xff09; MyBatis操作數據庫(優秀的持久層框架) MyBatis的寫法 開發規范&#xff1a; 單元測試的寫法 傳遞參數 Spring可以對日志進行分目錄打印 他的意思是說spring相關只打印INFO…

mysql中的DQL查詢

表格為&#xff1a; DQL 基礎查詢 語法&#xff1a;select 查詢列表 from 表名&#xff1a;&#xff08;查詢的結果是一個虛擬表格&#xff09; -- 查詢指定的列 SELECT NAME,birthday,phone FROM student -- 查詢所有的列 * 所有的列&#xff0c; 查詢結果是虛擬的表格&am…

中國各省、市鄉村振興水平數據(附stata計算代碼,2000-2022)

數據簡介&#xff1a;鄉村振興是當下經濟學研究的熱點之一&#xff0c;對鄉村振興進行測度&#xff0c;是研究基礎。測度鄉村振興水平的學術論文廣泛發表在《數量經濟技術經濟研究》等頂刊上。數據來源&#xff1a;主要來源于《中國農村統計年鑒》、《中國人口和就業統計年鑒》…

CRM系統選擇技巧,什么樣的CRM系統好用?

SaaS行業發展迅速&#xff0c;更多的企業逐漸選擇CRM管理系統。打開搜索引擎&#xff0c;有非常多的結果。怎樣在數十萬個搜索結果中選擇適合您的CRM系統&#xff1f;下面我們將聊聊&#xff0c;怎樣選擇CRM系統。 第一步&#xff1a;明確自身需求 重要性&#xff1a;每家企業…

仿照MyBatis手寫一個持久層框架學習

首先數據準備&#xff0c;創建MySQL數據庫mybatis&#xff0c;創建表并插入數據。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…

深入理解Java虛擬機----內存區域的劃分

Java虛擬機在執行Java程序的過程時&#xff0c;會將它管理的內存劃分為若干個不同的數據區域。主要分為以下幾個區域&#xff1a; 程序計數器 當前線程所執行的字節碼的行號指示器。字節碼解釋器工作時通過改變程序計數器來選取下一條需要執行的字節碼指令&#xff0c;分支、循…

nginx中Include使用

1.include介紹 自己的理解&#xff1a;如果學過C語言的話&#xff0c;感覺和C語言中的Include引入是一樣的&#xff0c;引入的文件中可以寫任何東西&#xff0c;比如server相關信息&#xff0c;相當于替換的作用&#xff0c;一般情況下server是寫在nginx.conf配置文件中的&…

VR串流線方案:實現同時充電傳輸視頻信號

VR&#xff08;Virtual Reality&#xff09;&#xff0c;俗稱虛擬現實技術&#xff0c;是一項具有巨大潛力的技術創新&#xff0c;正在以驚人的速度改變我們的生活方式和體驗&#xff0c;利用專門設計的設備&#xff0c;如頭戴式顯示器&#xff08;VR頭盔&#xff09;、手柄、定…

idea 本身快捷鍵ctrl+d復制 無法像eclipse快捷鍵ctrl+alt+上下鍵,自動換行格式問題解決

問題 例如我使用ctrld 想復制如下內容 復制效果如下&#xff0c;沒有自動換行&#xff0c;還需要自己在進行調整 解決 讓如下快捷鍵第一個刪除 修改成如下&#xff0c;將第二個添加ctrld 提示&#xff1a;對應想要修改的item&#xff0c;直接右鍵&#xff0c;remove是刪…

分子生成領域的stable diffusion - GEOLDM

一、關于stable diffusion 很多人都知道stable diffusion&#xff0c;stable diffusion的出現改變了機器生成領域&#xff0c;讓AI技術第一次無比的接近正常人。大語言模型&#xff0c;AIGC概念于是興起。基于stable diffusion 大家開發了lora&#xff0c; hyperwork等微調技術…

[GWCTF 2019]我有一個數據庫1

提示 信息收集phpmyadmin的版本漏洞 這里看起來不像是加密應該是編碼錯誤 這里訪問robots.txt 直接把phpinfo.php放出來了 這里能看到它所有的信息 這里并沒有能找到可控點 用dirsearch掃了一遍 ####注意掃描buuctf的題需要控制掃描速度&#xff0c;每一秒只能掃10個多一個都…

聚類算法的性能度量

聚類算法的性能度量 聚類算法就是根據數據中樣本與樣本之間的距離或相似度&#xff0c;將樣本劃分為若干組&#xff0f;類&#xff0f;簇&#xff0c;其劃分的原則&#xff1a;簇內樣本相似、簇間樣本不相似&#xff0c;聚類的結果是產生一個簇的集合。 其劃分方式主要分為兩…

API接口并發測試:如何測試API接口的最大并發能力?

本文將深入探討API接口并發測試&#xff0c;介紹并比較不同的API并發測試工具&#xff0c;并分享如何有效測量和提高API接口在最大并發情況下的性能。了解如何應對高并發壓力是保證系統穩定性和用戶滿意度的關鍵&#xff0c;讓我們一起來探索這個重要的話題。 隨著互聯網的迅速…

float,flex和grid布局

頁面布局往往會影響著整體的結構與項目的樣式&#xff0c;通常我們用的布局方式有三種&#xff1a;float,flex,grid 1.float或position布局 1.1概念 首先對于一個頁面來說&#xff0c;有浮動流&#xff0c;文檔流&#xff0c;文本流這幾種模式&#xff0c;而float布局則是…

【EI會議征稿中】第六屆下一代數據驅動網絡國際學術會議(NGDN 2024)

第六屆下一代數據驅動網絡國際學術會議&#xff08;NGDN 2024&#xff09; The Sixth International Conference on Next Generation Data-driven Networks 基于前幾屆在英國埃克塞特 (ISPA 2020) 、中國沈陽 (TrustCom 2021) 和中國武漢 (IEEETrustCom-2022)成功舉辦的經驗&a…

若依vue-新建目錄及菜單

前面我們把標題和logo換成了自己系統的標題和logo了 接下來就是要建立自己需要的菜單和頁面 新建目錄解析 在拉下來的代碼跑起來后 有一個系統菜單--菜單管理(如圖) 在這個菜單的這個頁面內有對應的操作功能 修改功能 這個功能可以修改寫好了的菜單數據 例如:名稱/排序/路由…