7

したがって、マップ const_iterator をエミュレートするスマート イテレーターがあり、戻り値の型を内部で構築する必要があります。明らかに、イテレータ クラスに a を格納したいのですがpair<Key, Value>(変更する必要があるため)、同時に逆参照関数で a を提示しpair<const Key, Value>たいと考えています (実際には、それぞれ a const pair<const Key, Value>&andになりconst pair<const Key, Value>*ます)。これまでに思いついた唯一の解決策は、反復子クラスが指す値が変更されるたびに新しいペアを動的に割り当てることです。言うまでもなく、これは良い解決策ではありません。

*const_cast<const pair<const Key, Value> >(&value)また、 wherevalueが として宣言されていることも試しましたpair<Key, Value>

どんな助けも大歓迎です(それができないという知識と同様に)。

編集

好奇心のために:私はpair<const Key, Value> pイテレータクラスに a を格納することになりました。ペアを変更するために、基になる反復子 ( map<Key, Value>::const_iterator it) に基づいて 2 つの要素を個別に変更し、次const_castのようにキーを変更できるようにします。

*const_cast<Key*>(&p.first) = it->first;
p.second = it->second;

私が非常に満足している解決策ではありませんが、それは仕事を成し遂げます。参照できる正しい型のものを保存しているので、逆参照メソッドは満足しています。

4

5 に答える 5

8

You can convert a value of type pair<Key,Value> to pair<const Key,Value>.

However, reading the question carefully, you're actually asking if, given a pair<Key,Value> you can create a pointer or reference to pair<const Key,Value> referring to the same object.

The answer is no - the only situation where a reference or pointer to one type can refer to an object of a different type is if the object type inherits from the referenced type.

pair<const Key&, Value&>1 つの可能性は、参照したいペアから作成された参照のペア を返すことです。

于 2011-11-29T04:33:45.733 に答える
5

はい。

std::pair<int, double> p(1,2);
std::pair<const int, double> q = p;   // no problem

//q.first = 8;  // error
q.second = 9;

int b; double d;
std::pair<int &, double &> s(b,d);
std::pair<int const &, double &> t = s;  // also fine
于 2011-11-29T04:26:39.380 に答える
2

Kerrek SB が指摘したように、std::pair<const Key, Value>から構築できますstd::pair<Key, Value>。ただし、元の質問は、イテレータが逆参照されるたびに std::pair オブジェクトを構築することを避けたいことを意味します。

残念ながら、これを行う良い方法はありません。特に operator-> の場合は、ペア オブジェクトを作成して実際にどこかに保存する必要がある場合があります。pair<const Key, Value>それ以外の場合は、イテレータからマップへの参照/ポインターを返すことができるように、マップを実際に保存できるようにする必要があります。基本的に参照/ポインターを返すには、その形式でどこかに保存する必要があります。一時的なものにすることはできません。

const_cast は避けてください。これは、ペアをこのようにキャストするために使用すると、頻繁に機能する可能性があるにもかかわらず、未定義の動作を求めているだけです。

于 2011-11-29T04:41:58.420 に答える