67

Im trying to figure out how to reverse the string temp when I have the string read in binary numbers

istream& operator >>(istream& dat1d, binary& b1)    
{              
    string temp; 

    dat1d >> temp;    
}
Yu Hao
  • 119,891
  • 44
  • 235
  • 294
Kameron Spruill
  • 679
  • 1
  • 5
  • 3
  • 2
    What do you mean by "read in binary numbers"? That the string will have something like "1100110"? That you're reading a binary file off of disk? – Max Lybbert Feb 10 '11 at 00:15

2 Answers2

111

I'm not sure what you mean by a string that contains binary numbers. But for reversing a string (or any STL-compatible container), you can use std::reverse(). std::reverse() operates in place, so you may want to make a copy of the string first:

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string foo("foo");
    std::string copy(foo);
    std::cout << foo << '\n' << copy << '\n';

    std::reverse(copy.begin(), copy.end());
    std::cout << foo << '\n' << copy << '\n';
}
Max Lybbert
  • 19,717
  • 4
  • 46
  • 69
  • 2
    It should be a void function since it does not return a value – Wilhelm Erasmus Mar 29 '17 at 15:32
  • 3
    `std::reverse` **is** a `void` function: http://en.cppreference.com/w/cpp/algorithm/reverse . – Max Lybbert Mar 30 '17 at 15:28
  • 3
    @MaxLybbert Yes, **however**, `main()` as it is implemented is not `void` and should return a value. This is what @Wilhelm was trying to point out. – karlphillip Dec 21 '17 at 22:59
  • 28
    I can add the "return 0", but it so happens that C++ has a special case for `main`: "if control reaches the end of `main` without encountering a return statement, the effect is that of executing `return 0;`" ( http://en.cppreference.com/w/cpp/language/main_function , 4th item on the special properties list). – Max Lybbert Dec 22 '17 at 14:51
61

Try

string reversed(temp.rbegin(), temp.rend());

EDIT: Elaborating as requested.

string::rbegin() and string::rend(), which stand for "reverse begin" and "reverse end" respectively, return reverse iterators into the string. These are objects supporting the standard iterator interface (operator* to dereference to an element, i.e. a character of the string, and operator++ to advance to the "next" element), such that rbegin() points to the last character of the string, rend() points to the first one, and advancing the iterator moves it to the previous character (this is what makes it a reverse iterator).

Finally, the constructor we are passing these iterators into is a string constructor of the form:

template <typename Iterator>
string(Iterator first, Iterator last);

which accepts a pair of iterators of any type denoting a range of characters, and initializes the string to that range of characters.

HighCommander4
  • 50,428
  • 24
  • 122
  • 194