-1

I have below two pieces of code:

// 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;
}

but why the output is mymultiset contains:PPP71 mymultiset contains:UUU71 mymultiset contains:KKK42KKK71

Abhishek Bhagate
  • 5,583
  • 3
  • 15
  • 32

1 Answers1

0

1) I'm not sure, but there's probably UB and it can cause segmentation fault (for example when you use clang) :

std::prev(container.begin())

For GCC, std::prev(container.begin() and container.begin() return the same value.

2) Why didn't you use reverse_iterator?

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

or

for (auto it: boost::adaptors::reverse(mymultiset))
    std::cout << "PPP" << it;
UnclePooh
  • 64
  • 7