關於C 容器的swap操作

2021-07-16 17:14:58 字數 2434 閱讀 1804

一、swap操作交換兩個相同型別的容器的內容,一般的容器(除array外),交換兩個容器內容的操作會保證非常快,因為並沒有交換元素本身,而只是交換了兩個容器的內部資料結構。

拿vector做個例子:

#include 

#include

int main()

; std::vector

ivec2;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

swap(ivec1, ivec2);

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

system("pause");

return

0;}

執行結果:

可以看到,交換的是整個的內部資料結構,各元素原來所儲存的值並沒有發生改變,只是這些元素已經屬於不用的容器了。所以容器中所儲存的元素的記憶體位址也發生了改變。所以swap操作後,指向容器內部的迭代器、引用和指標都任然有效,原來繫結的是哪個元素現在繫結的還是哪個元素

二、而swap兩個array則真正交換了各個元素:

#include 

#include

int main()

; std::array

arr2;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

swap(arr1, arr2);

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

for (int i = 0; i < 3; ++i)

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

std::cout

<< std::endl;

system("pause");

return

0;}

可以看到,交換後,兩個array交換了各個元素的值,即容器中所存的各個元素的記憶體位址並沒有交換,只是交換了相應位置的元素的值,所以說swap兩個array所需的時間和array中元素的數目成正比,同時,swap操作後,指向容器內部的迭代器、引用和指標都任然有效,原來繫結的是哪個元素現在繫結的還是哪個元素,只不過對應的元素值已經進行了交換。

三、和其它容器不同的是,對string呼叫swap會導致迭代器、引用和指標失效。因為string儲存的是字串,在string變數中真正儲存字串的是乙個叫_ptr的指標,它指向string所儲存的字串首位址,而字串並沒有固定位址,而是儲存在乙個臨時記憶體區域中,所以當字串發生改變時,會發生記憶體的重新分配,所以會導致迭代器、引用和指標失效。

如果以上解釋有問題,請大家及時指出噢。。。

STL容器swap操作介紹

今天通過這篇部落格,以兩個非常規視角介紹stl容器swap操作。swap操作非常容易理解,因為字面意思不多不少的表達了函式所做的事,也即 交換 關於swap做了什麼唯一值得關注的就是交換的是指標而非內容。那麼交換之後容器的狀態呢,是否可以通過交換達到其他什麼目的呢。常見的連續記憶體容器,例如vect...

C vector容器的swap方法

剛才在研究cocos2d x原始碼時,遇到這麼幾行 void autoreleasepool clear autoreleasepool是乙個用來託管記憶體的物件池,managedobjectarray是乙個std vector型別的成員,用來儲存所有管理的物件,這幾行 要做的事情就是 遍歷所有物件...

c STL 容器 中 swap的使用

主要涉及以下內容 可以從下面 中檢視上述內容的解釋 include include include void printvector std vectorv int swap usage int size capacity printf n std vectorv2 printf v2 n v2.r...