C++如何將一個(gè)vector內(nèi)容賦值給另一個(gè)vector,及swap與assign區(qū)別
賦值
方式一、申明時(shí)賦值
vector<int> v2; v2.push_back(0); v2.push_back(1); vector<int> v1(v2); //聲明
方式二、使用assign賦值
vector<int> v2; v2.push_back(0); v2.push_back(1); vector<int> v1; //聲明v1 v1.assign(v2.begin(), v2.end());//將v2賦值給v1
方式三、使用swap賦值
vector<int> v2; v2.push_back(0); v2.push_back(1); vector<int> v1(); v1.swap(v2); //將v2賦值給v1
方式四、迭代器遍歷賦值
使用迭代器和循環(huán)語句賦值的方法,其方法運(yùn)行效率較差:
vector<int> v2; v2.push_back(0); v2.push_back(1); vector<int> v1; vector<int>::iterator it;//聲明迭代器 for(it = v2.begin(); it!=v2.end(); ++it)//遍歷v2,賦值給v1 { v1.push_back(it); }
方式五、直接用等號(hào)(=)賦值
vector<int> v2; v2.push_back(0); v2.push_back(1); vector<int> v1; v1 = v2;
但這種方式需要注意:
如果在參數(shù)賦值,請(qǐng)注意使用指針或者引用,否則導(dǎo)致賦值失敗,該內(nèi)容不屬于本文討論范圍
但舉個(gè)例:
//引用方式傳參 int testFun1(vector<int> &v1) { vector<int> v2; v2.push_back(0); v2.push_back(1); v1 = v2; } //指針方式傳參 int testFun2(vector<int> *v1) { vector<int> v2; v2.push_back(0); v2.push_back(1); v1 = &v2; } //全局或者局部變量方式 vector<int> v2; int testFun2(vector<int> v1) { v2.push_back(0); v2.push_back(1); v1 = v2; } int testFun2() { //方式一 vector<int> v1; testFun1(&v1); //方式二 vector<int> *v2; testFun1(v2); //方式三 vector<int> v3; testFun1(v3); }
swap與assign的區(qū)別
我們此處主要討論它們兩的用作用和效率。
- 作用
swap和assign都可以用在將一個(gè)vector的內(nèi)容全部復(fù)制給另外一個(gè)vector,
區(qū)別是swap會(huì)改變?cè)磛ector,而assign會(huì)清空目的vector后再將源vector的值全部插入到目的vector中。
- 效率
swap只是交換vector的頭指針,時(shí)間復(fù)雜度是常數(shù);
而assigin時(shí)間復(fù)雜度則是線性。
測(cè)試代碼
#include <vector> #include "DebugUtility.h" #include <iostream> #include <algorithm> #include <string> using namespace std; void print(int x) { cout << x << endl; } void Swap(vector<string>& source, vector<string>& dest) { DebugUtility temp; dest.swap(source); } void Assign(vector<string>& source, vector<string>& dest) { DebugUtility temp; dest.assign(source.begin(), source.end()); } int main(int argc, const char *argv[]) { vector<string> source(900000, "90"); vector<string> destination(1, "abc"); Swap(source, destination); //source.clear(); //for_each(destination.begin(), destination.end(), print); //Assign(source, destination); //source.clear(); //for_each(destination.begin(), destination.end(), print); return 0; }
測(cè)試結(jié)果
Total time elapsed : 1 us
900000Total time elapsed : 12391 us
900000
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的動(dòng)態(tài)規(guī)劃子序列問題分析探討
可能有些讀者有接觸過動(dòng)態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動(dòng)態(tài)規(guī)劃這個(gè)東西,別擔(dān)心,我這篇文章會(huì)為讀者做一個(gè)入門,好讓讀者掌握這個(gè)重要的知識(shí)點(diǎn)2023-03-03C++實(shí)現(xiàn)產(chǎn)生隨機(jī)數(shù)和相應(yīng)的猜拳小游戲?qū)嵗a
C++中沒有自帶的random函數(shù),要實(shí)現(xiàn)隨機(jī)數(shù)的生成就需要使用rand()和srand()。下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)產(chǎn)生隨機(jī)數(shù)和相應(yīng)的猜拳小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09安裝OpenMPI來配合C語言程序進(jìn)行并行計(jì)算
這篇文章主要介紹了安裝OpenMPI來配合C語言程序進(jìn)行并行計(jì)算的例子,MPI的全稱是Message Passing Interface即標(biāo)準(zhǔn)消息傳遞界面,可以用于并行計(jì)算,需要的朋友可以參考下2015-11-11C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享
這篇文章主要介紹了C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享,需要的朋友可以參考下2014-08-08