I understand (at least I think I do)このポインタは、ランダムなSTLイテレータとして使用できます。ポインタによるSTLベクタ消去
ポインタをイテレータにキャストしない限り、次のコードがコンパイルされないのはなぜですか?
vector<int> v{1, 2, 3};
v.erase(&v[0]);
I understand (at least I think I do)このポインタは、ランダムなSTLイテレータとして使用できます。ポインタによるSTLベクタ消去
ポインタをイテレータにキャストしない限り、次のコードがコンパイルされないのはなぜですか?
vector<int> v{1, 2, 3};
v.erase(&v[0]);
あなたはstd::sort
、std::find
、またはstd::copy
ようアルゴリズムへのポインタを渡すことができます。これらは、適切なイテレータとして機能するものに対して構成可能なテンプレートです。
これは、異なるイテレータが必ず相互に変換するという意味ではありません。
std::vector<int>
コンテナのメソッドerase
は、イテレータと同じベクターの要素に対してのみ機能します。これはポインタとして実装されてもよい指摘し、それは通常はありませんが、ここに述べた理由のためにしたように: C++ std::vector<>::iterator is not a pointer, why?
はstd::find
を考えてみましょう。ここで
template< class InputIt, class T >
InputIt find(InputIt first, InputIt last, const T& value);
InputIt
テンプレートパラメータです。テンプレートstd::find
は、input iteratorの要件を満たし、operator*
がタイプT
と比較できるものを返すイテレータタイプで動作します。ポインタはここでうまくいきます。 Fire Lancerがコメントで正しく指摘したように、first
とlast
はInputIt
である必要があります。
今std::vector::eraseにこれを比較します
iterator erase(const_iterator pos);
これはstd::vector
クラスの型定義の一つである、const_iterator
をとります。これはイテレータの特定のタイプであり、テンプレートパラメータではありません。
これらのアルゴリズムへのポインタの**ペア**をうまく通過させることは事実上ランダムアクセスイテレータタイプです。しかし、ポインタがベクター内にあっても、ポインタとベクトル反復子をそれらの "ペア"として渡すことはできません。 –
vector.erase(...)
の定義は
iterator erase(const_iterator pos);
const iterator
自体のクラスです。 したがって、このクラスへのプレーン・ポインタの変換があった場合は、これを実行できます。しかし、私はそれがあるとは思わない。
しかし、イテレータが期待される場所で使用する方法と、アルゴリズムで使用する方法があります。
iterator
が必要な場合は、イテレータのみを使用できます。
アルゴリズムでは、iterator
は期待されません。 iteratorのConceptが満たされているオブジェクト(通常はbegin
とend
が必要なイテレータ/ポインタを返します)。
アルゴリズムは、 "開始/終了...のオブジェクト"ではなく、イテレータを期待しています。 – juanchopanza
アルゴリズムはテンプレートを使用します。パラメータは '' iterator'''の具体的な型ではありません。関数に '' iterator'''の概念を満たすオブジェクトを渡すことができます。 –
正確に私のポイント。修正をありがとう。 – juanchopanza
ポインタはイテレータですが、彼らは同じタイプとしてベクトルイテレータ(少なくとも、彼らがする必要はありません)ではありません。
このように、イテレータとポインタ演算を使用して、ポインタをベクトルの要素に変換することができます。
std::vector<int> v{1, 2, 3};
int* p = &v[0]; // a pointer
auto v_iter = v.begin() + std::distance(v.data(), p); // an equivalent vector::iterator
v.erase(v_iter);
std::vector
またはstd::array
のような連続した容器でのみ有効です。
なぜ要素へのポインタがイテレータ( 'std :: vector :: iterator')と同じであると思いますか? –
NathanOliver
どのようなエラーが表示されますか? –
イテレータはポインタを使用して実装できますが、ポインタは自動的にイテレータではありません。 –