スワップの1ベクター(リスト、forward_list同様両端キュー)
#include <iostream>
#include <vector>
using namespace std;
void show(int i, vector<int> &v1, vector<int> &v2, vector<int>::iterator i1, vector<int>::iterator i2, int &r1, int &r2, int *p1, int *p2);
int main()
{
vector<int> v1(1, 1);
vector<int> v2(2, 2);
// 迭代器
auto i1 = v1.begin();
auto i2 = v2.begin();
//引用
int &r1 = *v1.begin();
int &r2 = *v2.begin();
//指针
int *p1 = &(*v1.begin());
int *p2 = &(*v2.begin());
//输出
show(0, v1, v2, i1, i2, r1, r2, p1, p2);
//交换
swap(v1, v2);
//输出
cout << "\n--------------------------------------------------" << endl;
show(1, v1, v2, i1, i2, r1, r2, p1, p2);
return 0;
}
void show(int i, vector<int> &v1, vector<int> &v2, vector<int>::iterator i1, vector<int>::iterator i2, int &r1, int &r2, int *p1, int *p2)
{
if (i)
{
cout << "vector after:\n"
<< endl;
}
else
{
cout << "vector before:\n"
<< endl;
}
cout << "v1:";
for (auto &a : v1)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i1->" << *i1 << "(" << &(*i1) << ")"
<< "\tr1->" << r1 << "(" << &r1 << ")"
<< "\tp1->" << *p1 << "(" << &(*p1) << ")" << endl;
cout << "\nv2:";
for (auto &a : v2)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i2->" << *i2 << "(" << &(*i2) << ")"
<< "\tr2->" << r2 << "(" << &r2 << ")"
<< "\tp2->" << *p2 << "(" << &(*p2) << ")" << endl;
}
分析:
- 反復子I1、R1、P1ポインタが常に0x2c0f88ポイントの参照、1の値は、不変のまま;反復子I2は、参照R2、P2ポインタ常に0x2c0f98を指し、2の値は、不変のままです。
- 交換要素のアドレスである場合、スワップ、V1およびV2。0x2c0f88からv1の最初の要素のアドレスが0x2c0f98を交換し、0x2c0f98からv2の最初の要素のアドレスが0x2c0f88を置き換えます。
2.アレイ的スワップ
#include <iostream>
#include <array>
using namespace std;
void show(int i, array<int, 2> &a1, array<int, 2> &a2, array<int, 2>::iterator i1, array<int, 2>::iterator i2, int &r1, int &r2, int *p1, int *p2);
int main()
{
array<int, 2> a1{1, 1};
array<int, 2> a2{2, 2};
// 迭代器
auto i1 = a1.begin();
auto i2 = a2.begin();
//引用
int &r1 = *a1.begin();
int &r2 = *a2.begin();
//指针
int *p1 = &(*a1.begin());
int *p2 = &(*a2.begin());
//输出
show(0, a1, a2, i1, i2, r1, r2, p1, p2);
//交换
swap(a1, a2);
//输出
cout << "\n--------------------------------------------------" << endl;
show(1, a1, a2, i1, i2, r1, r2, p1, p2);
return 0;
}
void show(int i, array<int, 2> &a1, array<int, 2> &a2, array<int, 2>::iterator i1, array<int, 2>::iterator i2, int &r1, int &r2, int *p1, int *p2)
{
if (i)
{
cout << "array after:\n"
<< endl;
}
else
{
cout << "array before:\n"
<< endl;
}
cout << "a1:";
for (auto &a : a1)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i1->" << *i1 << "(" << &(*i1) << ")"
<< "\tr1->" << r1 << "(" << &r1 << ")"
<< "\tp1->" << *p1 << "(" << &(*p1) << ")" << endl;
cout << "\na2:";
for (auto &a : a2)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i2->" << *i2 << "(" << &(*i2) << ")"
<< "\tr2->" << r2 << "(" << &r2 << ")"
<< "\tp2->" << *p2 << "(" << &(*p2) << ")" << endl;
}
分析:
- 反復子I1、R1、P1ポインタは常に0x22feb0が、1から振動子2にその値を指す参照、反復子I2は、参照R2、P2ポインタが常に0x22fea8を指し、その値は1から2に変更されます。
- スワップ、A1及びA2は、その交換要素の値である場合。A1とA2の最初の要素のアドレスを変更しません。
スワップの3列
#include <iostream>
#include <vector>
using namespace std;
void show(int i, string &s1, string &s2, string::iterator i1, string::iterator i2, char &r1, char &r2, char *p1, char *p2);
int main()
{
string s1 = "a";
string s2 = "bc";
// 迭代器
auto i1 = s1.begin();
auto i2 = s2.begin();
//引用
char &r1 = *s1.begin();
char &r2 = *s2.begin();
//指针
char *p1 = &(*s1.begin());
char *p2 = &(*s2.begin());
//输出
show(0, s1, s2, i1, i2, r1, r2, p1, p2);
//交换
swap(s1, s2);
//输出
cout << "\n--------------------------------------------------" << endl;
show(1, s1, s2, i1, i2, r1, r2, p1, p2);
return 0;
}
void show(int i, string &s1, string &s2, string::iterator i1, string::iterator i2, char &r1, char &r2, char *p1, char *p2)
{
if (i)
{
cout << "string after:\n"
<< endl;
}
else
{
cout << "string before:\n"
<< endl;
}
cout << "s1:";
for (auto &a : s1)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i1->" << *i1 << "(" << &(*i1) << ")"
<< "\tr1->" << r1 << "(" << &r1 << ")"
<< "\tp1->" << *p1 << "(" << &(*p1) << ")" << endl;
cout << "\ns2:";
for (auto &a : s2)
{
cout << a << "(" << &a << ")\t";
}
cout << endl;
cout << "i2->" << *i2 << "(" << &(*i2) << ")"
<< "\tr2->" << r2 << "(" << &r2 << ")"
<< "\tp2->" << *p2 << "(" << &(*p2) << ")" << endl;
}
分析:
- ストリング即ち容器の唯一の内部データ構造を交換、ベクターと同様のスワップを行います。
- それは他の容器要素からのアドレス別に一時記憶領域に記憶されているように文字列が、割り当てられたメモリのあまりにも無駄、短すぎるからです。文字列は、スワップを実行すると、それはイテレータ、ポインタと参照が失敗した、文字列の再割り当てられたメモリになります。
4.まとめ
- 実際の交換に対応する、配列スワップを行う際に要素値、コンテナは、そのコンテナ(即ち、唯一の他の内部データ構造交換要素アドレス)。
- アレイの交換を行う場合、これは、2つのコンテナの必要要素および要素タイプの数、コンテナ・タイプを同じ、他のコンテナは、必要コンテナタイプおよび要素タイプを同じ。
- スワップ、元のコンテナ要素イテレータ、参照およびポインタをポイント行った後の文字列の障害 ;他のイテレータ元の容器、及び参照ポインタはまだ有効。