std :: prev проблема с набором или мультимножеством - PullRequest
0 голосов
/ 28 мая 2020

У меня есть два фрагмента кода:

// multiset::begin/end
#include <iostream>
#include <set>
#include <vector>
int main ()
{
  int myints[] = {42,71,12};
  std::set<int> mymultiset (myints,myints+2);
  std::set<int> mymultiset1 (myints,myints+2);
  std::set<int>::iterator it=std::prev(mymultiset.end());
  std::set<int>::iterator it1=std::prev(mymultiset1.end());
  std::cout << "mymultiset contains:";
  for (; it!=std::prev(mymultiset.begin()) && it1!=std::prev(mymultiset1.begin()); --it,--it1)
    std::cout << "PPP" << *it;
  std::cout << "\nmymultiset contains:";
for (it=std::prev(mymultiset.end()); it!=std::prev(mymultiset.begin()) ; --it)
    std::cout << "UUU" << *it;
  std::cout << "\nmymultiset contains:";
  for ( it=mymultiset.begin(); it!=(mymultiset.end()); it++)
    std::cout << "KKK" << *it;
  std::cout << '\n';


  return 0;
}

, но почему результат mymultiset содержит: PPP71 mymultiset содержит: UUU71 mymultiset содержит: KKK42KKK71

1 Ответ

0 голосов
/ 28 мая 2020

1) Я не уверен, но, вероятно, существует UB, и это может вызвать ошибку сегментации (например, когда вы используете clang):

std::prev(container.begin())

Для G CC std :: prev ( container.begin () и container.begin () возвращают одно и то же значение.

2) Почему вы не использовали reverse_iterator?

for (auto it = mymultiset.rbegin(); it != mymultiset.rend(); ++it)
      std::cout << "PPP" << *it;

или

for (auto it: boost::adaptors::reverse(mymultiset))
    std::cout << "PPP" << it;
...