C++のvectorとポインタ


文書ディレクトリ
  • 一、vectorへのポインタ
  • 1.&:スタックへのvector
  • (1)形式
  • (2)局所変数自動放出
  • (3)誤り区分
  • 2.New:スタック上のvector
  • を指す
  • (1)形式
  • (2)アクティブに解放されない限り、データは
  • から消失しない.
  • 二、vectorを指すポインタ配列
  • 1.p[i]:スタック上のvector
  • を指す
  • (1)形式
  • (2)局所変数自動放出
  • 2.p[i]:スタック上のvector
  • を指す
  • (1)形式
  • (2)アクティブに解放されない限り、データは
  • から消失しない.
  • 三、vector内はポインタ要素
  • である.
  • 1.スタック
  • 一、vectorへのポインタ
    1.&:スタック上のvectorを指す
    (1)形式
    スタック上のvector変数を指し、スタック上の変数は{}範囲によって自動的に解放されます(いわゆるローカル変数).
    対応するvectorのすべての5つの構造:
    https://blog.csdn.net/sandalphon4869/article/details/94589399#1_15
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int> k{ 1,2,3 };
    	//vector* p=&k;
    	vector<int>* p;
    	p = &k;
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//1 1 1
    
    	return 0;
    }
    

    など
    (2)局所変数自動解放
    p指向局所変数は括弧を出すと解放され、再び空を指すため、p->size()=0(分離初期化の形式で局所変数が解放される問題が発生する)
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int>* p;
    	{	
    		vector<int> k{ 1,2,3 };
    		p = &k;
    	}
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//       
    
    	return 0;
    }
    

    (3)誤区分
    例1
    pは最初はスタック領域のvectorを指すが,その後はスタック上の変数を指す.
    #include 
    #include 
    using namespace std;
    
    int main()
    {	
    	
    	vector<int>* p = new vector<int>{ 1,2,3 };
    	vector<int> k{ 4,5,6 };
    	p = &k;
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//4 5 6
    	//  1 2 3
    
    	return 0;
    }
    

    例2
    これは実際には局所変数を指しています.pは最初はスタック領域を指すvectorであったが,その後指す局所変数は括弧を出して解放され,空を再び指す.
    #include 
    #include 
    using namespace std;
    
    int main()
    {	
    	
    	vector<int>* p = new vector<int>{ 1,2,3 };
    	{
    		vector<int> k{ 4,5,6 };
    		p = &k;
    	}
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//       
    
    	return 0;
    }
    

    2.new:スタック上のvectorを指す
    (1)形式
    Newの方法は、スタック領域にデータメモリを割り当てることです.上のローカル変数とは異なり、deleteをアクティブに解放すると、データが消えます.vector* p = new vector{1,2,3};とは、ポインタが1つのnewを指していることを意味するので、vector* p;p=new vector{1,2,3};と書くのも1つの意味です.
    vector構造方法に対応する3つの構造.
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	//vector* p = new vector{1,2,3};
    	vector<int>* p;
    	p = new vector<int>{ 1,2,3 };
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//1 2 3
    
    	return 0;
    }
    
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	//vector* p = new vector(3);
    	vector<int>* p;
    	p = new vector<int>(3);
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//0 0 0
    
    	return 0;
    }
    
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	//vector* p = new vector(3,1);
    	vector<int>* p;
    	p = new vector<int>(3,1);
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//1 1 1
    
    	return 0;
    }
    

    (2)自発的に解放しない限り、データは消失しない
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int>* p;
    	{
    		p = new vector<int>{ 1,2,3 };
    	}
    
    	for (int i = 0; i < p->size(); i++)
    	{
    		cout << p->at(i) << ' ';
    	}
    	//1 2 3
    
    	return 0;
    }
    

    二、vectorを指すポインタ配列
    フォーマット:vector *p[5]1.p[i]:スタック上のvectorを指す
    (1)形式
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int> a{ 1,2,3 }, b{ 4,5,6 }, c{7,8,9,10};
    
    	//  1
    	vector<int>* p[3] = { &a,&b,&c };
    
    	/*
    	//  2
    	vector* p[3];
    	p[0] = &a, p[1] = &b, p[2] = &c;
    	*/
    	
    	for (int i = 0; i < 3; i++)
    	{
    		for (int j = 0; j < p[i]->size(); j++)
    		{
    			cout << p[i]->at(j) << ' ';
    		}
    		cout << endl;
    	}
    	/*
    	1 2 3
    	4 5 6
    	7 8 9 10
    	*/
    	return 0;
    }
    

    (2)局所変数自動解放
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int>* p[3];
    	{
    		vector<int> a{ 1,2,3 }, b{ 4,5,6 }, c{ 7,8,9,10 };
    		p[0] = &a, p[1] = &b, p[2] = &c;
    	}
    
    	for (int i = 0; i < 3; i++)
    	{
    		for (int j = 0; j < p[i]->size(); j++)
    		{
    			cout << p[i]->at(j) << ' ';
    		}
    		cout << endl;
    	}
    	// 
    	return 0;
    }
    

    2.p[i]:スタック上のvectorを指す
    (1)形式
    vector構造方法に対応する3つの構造.
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int>* p[3];
    	p[0] = new vector<int>{ 1,2,3 };
    	p[1] = new vector<int>(3);
    	p[2] = new vector<int>(4, 1);
    
    	for (int i = 0; i < 3; i++)
    	{
    		for (int j = 0; j < p[i]->size(); j++)
    		{
    			cout << p[i]->at(j) << ' ';
    		}
    		cout << endl;
    	}
    	/*
    	1 2 3
    	0 0 0
    	1 1 1 1
    	*/
    	return 0;
    }
    

    (2)自発的に解放しない限り、データは消失しない
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int>* p[3];
    	{
    		p[0] = new vector<int>{ 1,2,3 };
    		p[1] = new vector<int>(3);
    		p[2] = new vector<int>(4, 1);
    	}
    
    	for (int i = 0; i < 3; i++)
    	{
    		for (int j = 0; j < p[i]->size(); j++)
    		{
    			cout << p[i]->at(j) << ' ';
    		}
    		cout << endl;
    	}
    	/*
    	1 2 3
    	0 0 0
    	1 1 1 1
    	*/
    	return 0;
    }
    

    三、vector内はポインタ要素
    1.スタック
    #include 
    #include 
    using namespace std;
    
    int main()
    {
    	vector<int*> v;
    	
    	{
    		int a = 1, b = 2, c = 3;
    		v.push_back(&a);
    		v.push_back(&b);
    		v.push_back(&c);
    	}
    
    	for (int i = 0; i < v.size(); i++)
    	{
    		cout << *v[i] << ' ';
    	}
    	//1 2 3
    		
    	return 0;
    }
    

    参照先:https://blog.csdn.net/zjc_game_coder/article/details/52609902 https://blog.csdn.net/s9434/article/details/51052029#commentBox http://www.cppblog.com/lshain/articles/149664.html