2011-06-22 8 views
0

std::copyを2つの異なるイテレータからコピーしようとしています。しかし、実行中にこれらの2つのイテレータは同じ場所を指している可能性があります。なぜこのような状況では、彼らは単一の文字をコピーしません。std :: copyを使用して1文字をコピーする

std::string str1 = "ABC"; 
std::string::iterator itr1 = str1.begin(); 
std::string::iterator itr2 = str1.begin(); 
std::string result; 
std::copy(itr1,itr2,result.begin()); 
+0

「結果」には、コピーしたい文字を格納するのに十分な余裕がなければならないことに注意してください。長さ1で作成するか、その長さにサイズを変更するか、裏インサータを使用する必要があります。 – sbi

答えて

7

STLの範囲の右境界は包括的ではありません。同じイテレータに2回与えると、結果は空の範囲になります。

std::copy(itr1,itr2+1,result.begin()); 

しかし、未定義の動作である予約済みメモリのない場所に書き込みを行っていることに注意してください。あなたが使用する必要がありますback_insert_iterator

std::copy(itr1,itr2 + 1, std::back_inserter(result)); 
+0

さらに単純です: 'std :: string(itr1、itr2 + 1)' – ereOn

+1

@ereOn:あなたは 'std :: string result(itr、itr2 + 1)'を意味しますか?:) –

2

書き込み:

result.resize(1); //it must have some size 
std::copy(itr1,itr2 + 1,result.begin()); 

いっそ。

Nはあなたが resultにコピーする文字数です ​​

。あなたの状況では

1

、あなたは単に行うことができます:

std::string result(itr1, itr1 + 1); 

std::stringからそのコンテンツをコピーするために2つのイテレータを取るa constructorを持っているので。説明のために今

std::copy(itr1, itr2, res)コピーのすべての要素itr1から始まり、だけresで指定された場所itr2前に停止します。

つまり、itr1 == itr2の場合、2つのイテレータの間に「ギャップ」はなく、何もコピーされません。

だから、end()イテレータは通常、コレクションの最後の要素のを指しています。


は、3つの要素を持っている以下のベクター、vecを、考えてみましょう:あなたはbegin()std::copy()を使用してend()あなたが実際にvecのすべての要素をコピーする場合、ある

1, 2, 3, X 
^  ^
|  | 
|  \-- end() (X indicates a slot past the last element) 
\----------- begin() 

0

copy()への2番目のパラメータがコピーし、最後の1の後の要素です。 str1.end()は、その前ではなく最後の文字の後を指します。あなたの呼び出しはコピーする0文字を要求しており、それはあなたが得ているものです。電話をかける前にitr2を1つ進めることができます。

関連する問題