Const для неконстантного параўнання итераторов, яны сапраўдныя

У мяне ёсць два итератора ў кантэйнер, адзін сопзЬ і адзін неконстантные. Ці ёсць праблема з параўноўваючы іх, каб убачыць, калі яны абодва спасылаюцца на адзін і той жа аб'ект у кантэйнеры? Гэта агульны C ++ 11 итератора пытанне:

<�Р> Можа канстантнасцю і Неконстантный итератор правамерна параўнаць, каб убачыць, калі   яны абодва ставяцца да аднаго аб'екту, незалежна ад тыпу   кантэйнер (г.зн., яны абодва итератора, якія гарантавана см   да аб'ектаў у тым жа кантэйнеры або ў канцы гэтага кантэйнера (), але адзін з іх   канстанта, а іншай няма)?

Напрыклад, разгледзім наступны код:

some_c++11_container container;

// Populate container
...

some_c++11_container::iterator iObject1=container.begin();
some_c++11_container::const_iterator ciObject2=container.cbegin();

// Some operations that move iObject1 and ciObject2 around the container
...

if (ciObject2==iObject1)//Is this comparison allowed by the C++11 standard?
  ...; //Perform some action contingent on the equality of the two iterators
15
Вы ведаеце, што абодва итераторы ставяцца да элементаў у тым жа кантэйнеры? Гэта не адразу зразумела з пытання, так як вы апушчаны ініцыялізацыі ў вашым прыкладзе.
дададзена аўтар Adrian McCarthy, крыніца
Вы ведаеце, што абодва итераторы ставяцца да элементаў у тым жа кантэйнеры? Гэта не адразу зразумела з пытання, так як вы апушчаны ініцыялізацыі ў вашым прыкладзе.
дададзена аўтар Adrian McCarthy, крыніца
@Adrian, Я абнавіць прыклад, каб быць больш ясным па гэтым пытанні.
дададзена аўтар Michael Goldshteyn, крыніца
@Adrian, Я абнавіць прыклад, каб быць больш ясным па гэтым пытанні.
дададзена аўтар Michael Goldshteyn, крыніца
@Adrian, Я абнавіць прыклад, каб быць больш ясным па гэтым пытанні.
дададзена аўтар Michael Goldshteyn, крыніца
Вядома, яго сіла. Але зьвярніце ўвагу, што вы параўноўваеце итераторы, а не значэнне паказвае итераторы.
дададзена аўтар dchhetri, крыніца
Я думаў, што гэта было відавочна. Калі мы можам параўнаць неконстантные да канстантнасцю аб'екту не існуе ніякіх прычын, мы не павінны быць у стане зрабіць итераторы параўнання.
дададзена аўтар dchhetri, крыніца
Я думаў, што гэта было відавочна. Калі мы можам параўнаць неконстантные да канстантнасцю аб'екту не існуе ніякіх прычын, мы не павінны быць у стане зрабіць итераторы параўнання.
дададзена аўтар dchhetri, крыніца
Я думаў, што гэта было відавочна. Калі мы можам параўнаць неконстантные да канстантнасцю аб'екту не існуе ніякіх прычын, мы не павінны быць у стане зрабіць итераторы параўнання.
дададзена аўтар dchhetri, крыніца
<�Код> some_container :: итератор і some_container :: const_iterator можа быць розных тыпаў. У той час як яны мадэлююць T * і T сопзЬ * гэта не тое, што яны на самой справе. Вось чаму гэта добрае пытанне. Вы б цяжка знайсці прыклад, які не працуе, але гэта не азначае, што Стандарт гарантуе, што будзе працаваць. Ну, за выключэннем таго, што зараз пара адказаў паказвае, што ён робіць, але гэта не тое, што я лічыў бы відавочным/трывіяльна.
дададзена аўтар BoBTFish, крыніца
<�Код> some_container :: итератор і some_container :: const_iterator можа быць розных тыпаў. У той час як яны мадэлююць T * і T сопзЬ * гэта не тое, што яны на самой справе. Вось чаму гэта добрае пытанне. Вы б цяжка знайсці прыклад, які не працуе, але гэта не азначае, што Стандарт гарантуе, што будзе працаваць. Ну, за выключэннем таго, што зараз пара адказаў паказвае, што ён робіць, але гэта не тое, што я лічыў бы відавочным/трывіяльна.
дададзена аўтар BoBTFish, крыніца
<�Код> some_container :: итератор і some_container :: const_iterator можа быць розных тыпаў. У той час як яны мадэлююць T * і T сопзЬ * гэта не тое, што яны на самой справе. Вось чаму гэта добрае пытанне. Вы б цяжка знайсці прыклад, які не працуе, але гэта не азначае, што Стандарт гарантуе, што будзе працаваць. Ну, за выключэннем таго, што зараз пара адказаў паказвае, што ён робіць, але гэта не тое, што я лічыў бы відавочным/трывіяльна.
дададзена аўтар BoBTFish, крыніца
@ User814628 Доказы, калі ласка?
дададзена аўтар BoBTFish, крыніца

8 адказы

Так, гэта будзе працаваць, як вы чакаеце.

Стандартныя гарантыі, што для любога тыпу кантэйнера, some_container :: итератор можа быць няяўна пераўтвораны ў some_container :: const_iterator .

Першая табліца ў 23.2.1 [container.requirements.general], пасля вызначэння X у якасці тыпу кантэйнера, які змяшчае аб'екты тыпу T , мае:

<�Р> Выраз X :: итератор      <�Р> вяртаецца тып: тып итератора, тып якога значэнне T </р>      <�Р> Заўвага: любая катэгорыя итератора, які адказвае патрабаванні форвардной итераторов. канвертоўныя ў X :: const_iterator .      <�Ч>      <�Р> Выраз X :: const_iterator      <�Р> вяртаецца тып: пастаянны тып итератора, тып якога значэнне T </р>      <�Р>. Заўвага: любая катэгорыя итератора, які адказвае патрабаванням наперад итераторы

(Гэта на самай справе не выраз, і тыпы, а якія не маюць «вяртаюцца тыпаў», але гэта, як яны сціснутыя ў табліцу, якая з'яўляецца ў асноўным выразам.)

Таму, калі ў вас ёсць ciObject2 == iObject1 , заўважае, кампілятар, што лепшы аператар == гэта ciObject2 == some_container :: const_iterator (iObject1) , І аператар == на два const_iterator кажа вам, калі яны ставяцца да аднаго элементу.

(Я не бачу нічога відавочна казаць, што вынік гэтага пераўтварэння ставіцца да таго ж аб'екту, што і зыходны код <> итератора . Я думаю, што гэта проста зразумеў.)

12
дададзена
Калі вы можаце працытаваць кіраўніка і верш, я буду разглядаць пытанне адказ даць вам галачку.
дададзена аўтар Michael Goldshteyn, крыніца
Адзначым, што гэта не з'яўляецца абавязковым патрабаваннем на кантэйнерах, але спецыфікацыя інтэрфейсу для кантэйнераў, вызначаных у стандарце. Так што гэта не адносіцца да <�б> усе итераторы, толькі итераторы, якія прыходзяць з стандартных кантэйнераў. Для іншых крыніц итераторов (кантэйнеры ці іншым чынам), звярніцеся да дакументацыі.
дададзена аўтар Pete Becker, крыніца

Так, гэта будзе працаваць, як вы чакаеце.

Стандартныя гарантыі, што для любога тыпу кантэйнера, some_container :: итератор можа быць няяўна пераўтвораны ў some_container :: const_iterator .

Першая табліца ў 23.2.1 [container.requirements.general], пасля вызначэння X у якасці тыпу кантэйнера, які змяшчае аб'екты тыпу T , мае:

<�Р> Выраз X :: итератор      <�Р> вяртаецца тып: тып итератора, тып якога значэнне T </р>      <�Р> Заўвага: любая катэгорыя итератора, які адказвае патрабаванні форвардной итераторов. канвертоўныя ў X :: const_iterator .      <�Ч>      <�Р> Выраз X :: const_iterator      <�Р> вяртаецца тып: пастаянны тып итератора, тып якога значэнне T </р>      <�Р>. Заўвага: любая катэгорыя итератора, які адказвае патрабаванням наперад итераторы

(Гэта на самай справе не выраз, і тыпы, а якія не маюць «вяртаюцца тыпаў», але гэта, як яны сціснутыя ў табліцу, якая з'яўляецца ў асноўным выразам.)

Таму, калі ў вас ёсць ciObject2 == iObject1 , заўважае, кампілятар, што лепшы аператар == гэта ciObject2 == some_container :: const_iterator (iObject1) , І аператар == на два const_iterator кажа вам, калі яны ставяцца да аднаго элементу.

(Я не бачу нічога відавочна казаць, што вынік гэтага пераўтварэння ставіцца да таго ж аб'екту, што і зыходны код <> итератора . Я думаю, што гэта проста зразумеў.)

12
дададзена
Калі вы можаце працытаваць кіраўніка і верш, я буду разглядаць пытанне адказ даць вам галачку.
дададзена аўтар Michael Goldshteyn, крыніца
Адзначым, што гэта не з'яўляецца абавязковым патрабаваннем на кантэйнерах, але спецыфікацыя інтэрфейсу для кантэйнераў, вызначаных у стандарце. Так што гэта не адносіцца да <�б> усе итераторы, толькі итераторы, якія прыходзяць з стандартных кантэйнераў. Для іншых крыніц итераторов (кантэйнеры ці іншым чынам), звярніцеся да дакументацыі.
дададзена аўтар Pete Becker, крыніца

From §24.2.3/1

<�Р> Клас або паказальнік тыпу X задавальняе патрабаванням, што прад'яўляюцца да ўваходнага итератора для тыпу значэння T , калі X задавальняе Iterator (24.2.2) і EqualityComparable ( Табліца 17 ) патрабаванні да ...

Такім чынам, ўваходныя итераторы павінны быць EqualityComparable .

Усе стандартныя бібліятэкі кантэйнераў итераторы павінны задавальняць патрабаванням итератора наперад ( §23.2.1 - Табліца 96 ). Паколькі гэтыя патрабаванні з'яўляюцца падмноствам патрабаванняў ўваходных итераторов, то гэтыя итераторы павінны задавальняць EqualityComparable паняцце.

Акрамя таго, ад §23.2.1 - Табліца 96 , X :: итератор патрабуецца, каб быць канвертаваны ў <�Код> X :: const_iterator .

Даданне двух разам адказ на ваша пытанне, што гэта сапраўды патрабуе стандарт, што параўнанне Container :: const_iterator да Container :: итератор добра вызначаны (да таго часу, абодва з'яўляюцца сапраўднымі итераторы, якія паказваюць на той жа кантэйнер).

1
дададзена

From §24.2.3/1

<�Р> Клас або паказальнік тыпу X задавальняе патрабаванням, што прад'яўляюцца да ўваходнага итератора для тыпу значэння T , калі X задавальняе Iterator (24.2.2) і EqualityComparable ( Табліца 17 ) патрабаванні да ...

Такім чынам, ўваходныя итераторы павінны быць EqualityComparable .

Усе стандартныя бібліятэкі кантэйнераў итераторы павінны задавальняць патрабаванням итератора наперад ( §23.2.1 - Табліца 96 ). Паколькі гэтыя патрабаванні з'яўляюцца падмноствам патрабаванняў ўваходных итераторов, то гэтыя итераторы павінны задавальняць EqualityComparable паняцце.

Акрамя таго, ад §23.2.1 - Табліца 96 , X :: итератор патрабуецца, каб быць канвертаваны ў <�Код> X :: const_iterator .

Даданне двух разам адказ на ваша пытанне, што гэта сапраўды патрабуе стандарт, што параўнанне Container :: const_iterator да Container :: итератор добра вызначаны (да таго часу, абодва з'яўляюцца сапраўднымі итераторы, якія паказваюць на той жа кантэйнер).

1
дададзена

Я не думаю, што гэта магчыма там будзе пытанне, параўноўваючы іх. Калі ў вас ёсць канстантнасцю итератор калі вы сканчалі за гэты час канец итератор канец() вяртае ня Вусны.

1
дададзена
<�Код> Container :: канец() Функцыі-члены маюць 2 перагрузкам, адзін які вяртае сопзЬ итератор, а другі не- канстантнасцю .
дададзена аўтар Praetorian, крыніца
Я заўсёды думаў, што cbegin() і cend() былі дададзеныя, каб дапамагчы з аўтаматычным тыпам дэдукцыі. Напрыклад: аўто ciObject = myContainer.cbegin ();//ciObject з'яўляецца канстантнасцю итератор аб'екта
дададзена аўтар Michael Goldshteyn, крыніца
Я заўважыў, што вяртанне канец() гэта завяршальная тып звароту, будзе аўтаматычна захоўваць сопзЬ
дададзена аўтар aaronman, крыніца

Я не думаю, што гэта магчыма там будзе пытанне, параўноўваючы іх. Калі ў вас ёсць канстантнасцю итератор калі вы сканчалі за гэты час канец итератор канец() вяртае ня Вусны.

1
дададзена
<�Код> Container :: канец() Функцыі-члены маюць 2 перагрузкам, адзін які вяртае сопзЬ итератор, а другі не- канстантнасцю .
дададзена аўтар Praetorian, крыніца
Я заўсёды думаў, што cbegin() і cend() былі дададзеныя, каб дапамагчы з аўтаматычным тыпам дэдукцыі. Напрыклад: аўто ciObject = myContainer.cbegin ();//ciObject з'яўляецца канстантнасцю итератор аб'екта
дададзена аўтар Michael Goldshteyn, крыніца
Я заўважыў, што вяртанне канец() гэта завяршальная тып звароту, будзе аўтаматычна захоўваць сопзЬ
дададзена аўтар aaronman, крыніца

IIRC итератора няяўна пераўтворыцца ў const_iterator . І вынік павінен паказваць на тую ж пазіцыю.

Калі гэта так змяшанае параўнанне будзе рабіць пераўтварэнне затым параўнаць цяпер сумясціць const_iterators.

1
дададзена

IIRC итератора няяўна пераўтворыцца ў const_iterator . І вынік павінен паказваць на тую ж пазіцыю.

Калі гэта так змяшанае параўнанне будзе рабіць пераўтварэнне затым параўнаць цяпер сумясціць const_iterators.

1
дададзена