C++Primer問題まとめ(6)
第9章
に質問
1.stringおよびvector要素は連続したメモリ領域に格納されるため、挿入要素を削除すると複数の要素が移動します.また、連続するため、要素には下付きでランダムにアクセスできます.2.listの要素は連続空間に格納されていないため、ランダムに要素にアクセスできないが、削除が速く、変更が遅い.3.deque両端キュー、高速ランダムアクセス要素をサポートし、削除も速い4.Arrayは固定サイズ配列、forward_リストは一方向でpush_back()、size().forward_を得るためにlistオブジェクトのサイズは,distanceアルゴリズムを用いてbeginとend間の距離を計算することができ,この動作は線形時間複雑度である.5.容器の大きさはsize_type測定6.シーケンスコンテナレプリケーションコンストラクタパラメータタイプは、呼び出しオブジェクトと同じタイプでなければなりません.コンストラクタパラメータが反復器の場合、タイプは異なりますが、コンテナ内の要素のタイプは互いに変換できます.例えばintとdouble 7.arrayはカッコリストの付与を許可しない.ここではリストの初期化8ではない.swapの2つのパラメータのタイプは同じでなければならない.要素は移動していないため、反復器は失効しない(stringを除く).arrayは固定サイズなので、arrayオブジェクトをswapで交換すると、本当に要素が交換されます.10.insert(p,t)pが要素を指す前にt 11を作成する.コンテナをオブジェクトで初期化したり、コンテナにオブジェクトを挿入したりすると、実際にコンテナに入れられたのはオブジェクト値のコピーです.12.push.back()arrayとforward_Listは13をサポートしていません.push.front()stringとvectorはサポートされていません.挿入するたびに後ろの要素を移動する必要があります.サポートできるのはおかしいです.14.insertは、コンテナ内の任意の場所で要素を挿入することをサポートします.このメンバー関数は後で追加されると思います.15.insert(p,args)は、最初の新しい追加要素を指し、要素が挿入されていない場合はpを返す反復器を返すことに注意してください.16.emplaceとinsertの違いは,個人的には伝達オブジェクトと一時オブジェクト(呼び出し構造関数)の違いにすぎないと考えられる.Emplaceは一度に1つのオブジェクトしか渡さず、insertはオブジェクトの範囲を渡すことができます.17.各シーケンスコンテナにはforward_を除いてfrontメンバー関数があります.listに加えて、各シーケンスコンテナにはbackメンバー関数18がある.vector、deque、string、arayタイプは、下付きおよびat[]アクセス要素を直接使用できます.19.c.at(n)は、nと表記された要素の参照を返し、下限を越えると異常を放出する.20.eraseはinsertと同様に反復器を返し、eraseは要素を削除した後の要素を指す反復器を返します.Insertは、新しい挿入要素を指す反復器21を返す.forward_Listは一方向チェーンテーブルなので、新しい削除要素は1つの要素の後にinsert_があることが望ましい.after、emplace_after、erase_after. 22.resizeコンテナのサイズを変更します.arrayはサポートしていません.現在のサイズが要求されたサイズより大きい場合は、コンテナの後部の要素を削除します.現在のサイズが所望のサイズより小さい場合は、容器の後部に要素を追加し、元の要素は変更されません.23.shrink_to_fit()はcapacity()をsize()サイズ24に減少する.stringクラスのsubstr()のパラメータは文字列の下付き25である.stringクラスはinsertとseraseをサポートするが、パラメータは必ずしも反復器ではなく、下付きのタイプ26であってもよい.stringにはreplaceとappendメンバー関数があり、replaceの代わりにappend接合27がある.string検索操作、各検索操作は、下付きfind、find_を返します.first_of、find_last_of、find_first_not_of、find_last_not_of、rfind
練習問題
9.2
9.4
9.5
9.13
9.14
9.15
9.16
9.18
9.20
9.24
9.26
9.27
9.28
に質問
1.stringおよびvector要素は連続したメモリ領域に格納されるため、挿入要素を削除すると複数の要素が移動します.また、連続するため、要素には下付きでランダムにアクセスできます.2.listの要素は連続空間に格納されていないため、ランダムに要素にアクセスできないが、削除が速く、変更が遅い.3.deque両端キュー、高速ランダムアクセス要素をサポートし、削除も速い4.Arrayは固定サイズ配列、forward_リストは一方向でpush_back()、size().forward_を得るためにlistオブジェクトのサイズは,distanceアルゴリズムを用いてbeginとend間の距離を計算することができ,この動作は線形時間複雑度である.5.容器の大きさはsize_type測定6.シーケンスコンテナレプリケーションコンストラクタパラメータタイプは、呼び出しオブジェクトと同じタイプでなければなりません.コンストラクタパラメータが反復器の場合、タイプは異なりますが、コンテナ内の要素のタイプは互いに変換できます.例えばintとdouble 7.arrayはカッコリストの付与を許可しない.ここではリストの初期化8ではない.swapの2つのパラメータのタイプは同じでなければならない.要素は移動していないため、反復器は失効しない(stringを除く).arrayは固定サイズなので、arrayオブジェクトをswapで交換すると、本当に要素が交換されます.10.insert(p,t)pが要素を指す前にt 11を作成する.コンテナをオブジェクトで初期化したり、コンテナにオブジェクトを挿入したりすると、実際にコンテナに入れられたのはオブジェクト値のコピーです.12.push.back()arrayとforward_Listは13をサポートしていません.push.front()stringとvectorはサポートされていません.挿入するたびに後ろの要素を移動する必要があります.サポートできるのはおかしいです.14.insertは、コンテナ内の任意の場所で要素を挿入することをサポートします.このメンバー関数は後で追加されると思います.15.insert(p,args)は、最初の新しい追加要素を指し、要素が挿入されていない場合はpを返す反復器を返すことに注意してください.16.emplaceとinsertの違いは,個人的には伝達オブジェクトと一時オブジェクト(呼び出し構造関数)の違いにすぎないと考えられる.Emplaceは一度に1つのオブジェクトしか渡さず、insertはオブジェクトの範囲を渡すことができます.17.各シーケンスコンテナにはforward_を除いてfrontメンバー関数があります.listに加えて、各シーケンスコンテナにはbackメンバー関数18がある.vector、deque、string、arayタイプは、下付きおよびat[]アクセス要素を直接使用できます.19.c.at(n)は、nと表記された要素の参照を返し、下限を越えると異常を放出する.20.eraseはinsertと同様に反復器を返し、eraseは要素を削除した後の要素を指す反復器を返します.Insertは、新しい挿入要素を指す反復器21を返す.forward_Listは一方向チェーンテーブルなので、新しい削除要素は1つの要素の後にinsert_があることが望ましい.after、emplace_after、erase_after. 22.resizeコンテナのサイズを変更します.arrayはサポートしていません.現在のサイズが要求されたサイズより大きい場合は、コンテナの後部の要素を削除します.現在のサイズが所望のサイズより小さい場合は、容器の後部に要素を追加し、元の要素は変更されません.23.shrink_to_fit()はcapacity()をsize()サイズ24に減少する.stringクラスのsubstr()のパラメータは文字列の下付き25である.stringクラスはinsertとseraseをサポートするが、パラメータは必ずしも反復器ではなく、下付きのタイプ26であってもよい.stringにはreplaceとappendメンバー関数があり、replaceの代わりにappend接合27がある.string検索操作、各検索操作は、下付きfind、find_を返します.first_of、find_last_of、find_first_not_of、find_last_not_of、rfind
練習問題
9.2
/*9.2*/
deque<int>a = { 1,2,3 };
deque<int>b(a.begin(),a.end());
list<deque<int>> l;
l.insert(l.begin(),10, a);
for (auto i : l)
{
for (auto a : i)
cout << a << endl;
}
cout << *(l.begin()) << *(l.end());
9.4
bool it(vector<int>::iterator i, vector<int>::iterator j, int k)
{
for (auto a = i; a != j; a++)
{
if (*a == k)
return true;
}
return false;
}
int main()
{
/*9.4*/
vector<int>i{ 1,2,3 };
cout << it(i.begin(), i.end(), 2);
}
9.5
vector<int>::iterator it(vector<int>::iterator i, vector<int>::iterator j, int k)
{
for (auto a = i; a != j; a++)
{
if (*a == k)
return a;
}
return j;
}
int main()
{
/*9.5*/
vector<int>i{ 1,2,3 };
cout << *(it(i.begin(), i.end(), 2));
}
9.13
/*9.13*/
#include
#include
#include
#include
using std::list;
using std::vector;
using std::cout;
using std::endl;
int main()
{
list<int> ilst(5, 4);
vector<int> ivc(5, 5);
//! from list to vector
vector<double> dvc(ilst.begin(), ilst.end());
for (auto i : ilst) cout << i;
cout << endl;
for (auto t : dvc) cout << t;
cout << endl;
//! from vector to vector
vector<double> dvc2(ivc.begin(), ivc.end());
for (auto i : ivc) cout << i;
cout << endl;
for (auto t : dvc2) cout << t;
return 0;
}
9.14
int main()
{
/*9.14*/
vector<const char *>i = { "a","b","c" };
list<string> p;
p.assign(i.begin(), i.end());
for (auto a : p)
cout << a << endl;
}
9.15
bool Compare(vector<int> a, vector<int> b)
{
if (a > b)
return true;
else
return false;
}
int main()
{
/*9.15*/
vector<int> a, b; //
cout << Compare(a, b) << endl; // o
}
9.16
int main()
{
/*9.16*/
std::list<int> list{ 1, 2, 3, 4, 5 };
std::vector<int> vec1{ 1, 2, 3, 4, 5 };
std::vector<int> vec2{ 1, 2, 3, 4 };
/* */
std::cout << std::boolalpha
<< (std::vector<int>(list.begin(), list.end()) == vec1)
<< std::endl;
std::cout << std::boolalpha
<< (std::vector<int>(list.begin(), list.end()) == vec2)
<< std::endl;
}
9.18
/*9.18*/
int main()
{
string a;
deque<string> d;
while (cin >> a)
{
d.push_back(a);
if (a == "^Z")
break;
}
for (auto p : d)
cout << p << endl;
}
9.20
int main()
{
/*9.20*/
list<int>a = { 1,2,3,4,5,6,7,8,9 };
deque<int>b, c;
for (auto p = a.begin(); p != a.end(); p++)
{
if ((*p) % 2 == 0)
b.push_front(*p);
else
c.push_front(*p);
}
for (auto p : b)
cout << p << endl;
for (auto p : c)
cout << p << endl;
}
9.24
int main()
{
/*9.24*/
vector<int>v{1};
int v1 = v.front();
int v2 = (*v.begin());
int v3 = v[0];
int v4 = v.at(0);
cout << v1 << v2 << v3 << v4 << endl;
}
9.26
void show(vector<int>i,list<int> l,int p[])
{
int a = 0;
while(a<=11)
{
auto it = (l.begin())++;
auto it2 = (i.begin())++;
if((p[a]%2)==1 && it!=l.end())
l.erase(it);
else
i.erase(it2);
a++;
}
}
int main()
{
/*9.26*/
int ia[] = { 0,1,1,2,3,5,8,13,21,55,89 };
vector<int> v(ia,ia+11);
list<int>l(ia,ia+11);
show(v, l, ia);
for (auto b : v)
cout << b ;
for (auto b : l)
cout << b;
}
9.27
int main()
{
/*9.27*/
forward_list<int> flst = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto prev = flst.before_begin(), curr = flst.begin();
curr != flst.end();)
if (*curr & 0x1)
curr = flst.erase_after(prev);
else
prev = curr++;
for (auto i : flst) cout << i << " ";
cout << endl;
}
9.28
void Search(forward_list<string> &fl, const string &a, const string &b)
{
auto p1 = fl.before_begin();
for(auto p = fl.begin();p!=fl.end();p1++,p++)
{
if (*p == a)
fl.insert_after(p, b);
return;
}
fl.insert_after(p1,b);
}
int main()
{
/*9.28*/
forward_list<string> FL{"hello"};
Search(FL, "hello", "world");
for (auto p : FL)
cout << p << endl;
}