C++Primer問題まとめ(6)

45996 ワード

第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.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;
}