ターゲットマージ【C++】コンテナ要素のコピーと変換
5225 ワード
今までずっと目标の合并などの问题を研究していましたが、午后はちょうど皆さんと分かち合う机会がありました.
一、コンテナ要素のコピー:copy()アルゴリズム
copy()の原形は以下の通りです.
列子:2枚の成果表を集計し、成果総表を構成します.
二、コンテナ要素の逆コピー:copy_backward()
copy()関数は、あるコンテナのデータを別のコンテナに順方向にコピーできますが、後でターゲットコンテナに配置する必要がある場合があります.copy_backward()を適用できます.
原形:
例えば、高校の2倍の募集拡大
三、コンテナ要素merge()をマージする
2つのソースコンテナのデータをターゲットコンテナにマージするアルゴリズム.
プロトタイプ:
に注意
:merge()アルゴリズムを適用する前にsort()アルゴリズムを適用して2つのソースコンテナのデータをソートする必要があります.
四、冗長要素コンテナset_をマージして除去するunion()
merge()を適用してコンテナをマージする場合、2つのマージされたコンテナに同じ要素がある場合、マージされたコンテナに同じデータが2つ出てくることがあります.これは不要な場合があります.
毎日同じ理屈
青春は意志の血の滴と奮闘する汗で醸成した寒天--長い間弥香;青春は枯れない希望と消えないあこがれで編んだ虹--きらびやかで輝かしい.青春は永遠の執着と粘り強さで築かれた銅の壁の鉄壁である.
また、STLにはset_も用意されていますdifference()は、2つのコンテナの差セットを計算するために使用され、set_intersection()は、2つのコンテナの交差を計算するために使用されます.
五、変換容器要素transform()
要素をコピーするときに、要素を操作する必要がある場合があります.たとえば、あるコンテナのデータを元の2倍にしたい.
copy()はデータを移動できますが、移動中にデータを操作することはできません.Transform()はこの仕事をしています
プロトタイプ:
例:大学受験後、先生は55点以上、60点以下は60点に調整する
あるプログラマーは書道に非常に興味を持っており、定年退職後、この方面に木を建てることにした.大金を使って上等な文房四宝を購入した.ある日突然雅興が生まれて、墨を磨いて紙を作って、そして良い檀の香りをつけて、王羲の風格があって、また顔真卿の勢いを持って、神を落ち着かせてしばらくして、墨をかけて揮毫して、丁寧に1行の字を書きます:hello world.
一、コンテナ要素のコピー: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.