ターゲットマージ【C++】コンテナ要素のコピーと変換

5225 ワード

今までずっと目标の合并などの问题を研究していましたが、午后はちょうど皆さんと分かち合う机会がありました.
一、コンテナ要素のコピー:copy()アルゴリズム
copy()の原形は以下の通りです.
template<class InputIterator, class OutputIterator>

		OutputIterator copy(

		InputIterator _First, //       

		InputIterator _Last, //       

		OutputIterator _DestBeg //         

		);

列子:2枚の成果表を集計し、成果総表を構成します.
vector<int> vecScore1;

	vector<int> vecScore2;

	//       ,    

	...

	//        

	vector<int> vecScore;

	//         ,          

	vecScore.resize(vecScore1.size() + vecScore2.size());

	//         itLast                 

	vector<int>::iterator itLast = copy(vecScore1.begin(), vecScore1.end(), vecScore.begin());

	//     

	copy(vecScore2.begin(), vecScore2.end(), itLast);

    
二、コンテナ要素の逆コピー:copy_backward()
copy()関数は、あるコンテナのデータを別のコンテナに順方向にコピーできますが、後でターゲットコンテナに配置する必要がある場合があります.copy_backward()を適用できます.
原形:
template<class BidirectionalIterator1, class BidirectionalIterator2>

   BidirectionalIterator2 copy_backward(

      BidirectionalIterator1 _First, 

      BidirectionalIterator1 _Last,

      BidirectionalIterator2 _DestEnd //              ,                  

   );

例えば、高校の2倍の募集拡大
vector<Student> vecStudent;

	//       ,    

	...

	//      

	vecStudent.resize(vecStudent.size() * 2);

	copy_backward(vecStudent.begin(), vecStudent.begin() + vecStudent.size() / 2, vecStudent.end());

三、コンテナ要素merge()をマージする
2つのソースコンテナのデータをターゲットコンテナにマージするアルゴリズム.
プロトタイプ:
template<class InputIterator1, class InputIterator2, class OutputIterator>

   OutputIterator merge(

      InputIterator1 _First1, 

      InputIterator1 _Last1,

      InputIterator2 _First2, 

      InputIterator2 _Last2, 

      OutputIterator _Result

   );

に注意
:merge()アルゴリズムを適用する前にsort()アルゴリズムを適用して2つのソースコンテナのデータをソートする必要があります.
vector<int> vecScore1;

	vector<int> vecScore2;

	vector<int> vecScore;

	//    

	...

	sort(vecScore1.begin(), vecScore1.end());

	sort(vecScore2.begin(), vecScore2.end());

	//          

	vecScore.resize(vecScore1.size() + vecScore2.size());

	//         

	merge(vecScore1.begin(), vecScore1.end(),

			 vecScore2.begin(), vecScore2.end(),

			 vecScore.begin());

}

四、冗長要素コンテナset_をマージして除去するunion()
merge()を適用してコンテナをマージする場合、2つのマージされたコンテナに同じ要素がある場合、マージされたコンテナに同じデータが2つ出てくることがあります.これは不要な場合があります.
毎日同じ理屈
青春は意志の血の滴と奮闘する汗で醸成した寒天--長い間弥香;青春は枯れない希望と消えないあこがれで編んだ虹--きらびやかで輝かしい.青春は永遠の執着と粘り強さで築かれた銅の壁の鉄壁である.
//    

	vector<string> vecGoods;

	//     

	vector<string> vecStationaries;

	vecStationaries.push_back("Pen");

	vecStationaries.push_back("Notes");

	//       

	vector<string> vecOfficeSupplies;

	vecOfficeSupplies.push_back("Pen");

	vecOfficeSupplies.push_back("Files");



	//      

	vecGoods.resize(vecOfficeSupplies.size() + vecStationaries.size());

	//        

	sort(vecStationaries.begin(), vecStationaries.end());

	sort(vecOfficeSupplies.begin(), vecOfficeSupplies.end());



	//   set_union()        

	// set_union()                        

	vector<string>::iterator itEnd = 

		set_union(vecStationaries.begin(), vecStationaries.end(),

		              vecOfficeSupplies.begin(), vecOfficeSupplies.end(),

		               vecGoods.begin());

	//        

	for (vector<string>::iterator it  = vecGoods.begin(); it != itEnd; ++it)

	{

		cout<<*it<<endl;

	}

また、STLにはset_も用意されていますdifference()は、2つのコンテナの差セットを計算するために使用され、set_intersection()は、2つのコンテナの交差を計算するために使用されます.
五、変換容器要素transform()
要素をコピーするときに、要素を操作する必要がある場合があります.たとえば、あるコンテナのデータを元の2倍にしたい.
copy()はデータを移動できますが、移動中にデータを操作することはできません.Transform()はこの仕事をしています
プロトタイプ:
template<class InputIterator, class OutputIterator, class UnaryFunction>

   OutputIterator transform(

      InputIterator _First1, 

      InputIterator _Last1, 

      OutputIterator _Result,

      UnaryFunction _Func //       

   );

template<class InputIterator1, class InputIterator2, class OutputIterator,

   class BinaryFunction>

   OutputIterator transform(

      InputIterator1 _First1, 

      InputIterator1 _Last1,

      InputIterator2 _First2, //         

      OutputIterator _Result,

      BinaryFunction _Func

   );

例:大学受験後、先生は55点以上、60点以下は60点に調整する
/               

int Increase(int nScore)

{

	if (nScore > 55 && nScore < 60)

	{

		nScore = 60;

	}

	return nScore;

}



vector<int> vecScore;



vecScore.push_back(26);

vecScore.push_back(56);

vecScore.push_back(72);

//          

transform(vecScore.begin(), vecScore.end(),  //       

		  vecScore.begin() ,                      ///              

		  Increase);

    
    
    
    
あるプログラマーは書道に非常に興味を持っており、定年退職後、この方面に木を建てることにした.大金を使って上等な文房四宝を購入した.ある日突然雅興が生まれて、墨を磨いて紙を作って、そして良い檀の香りをつけて、王羲の風格があって、また顔真卿の勢いを持って、神を落ち着かせてしばらくして、墨をかけて揮毫して、丁寧に1行の字を書きます:hello world.