Solved

What is the output of this sort function?

Posted on 2008-06-10
5
206 Views
Last Modified: 2010-04-21
IF
vector<int>   A;   // 10 elements, say 0-9
vector<long>   B;  // 10   elements, say all == 1
AND
struct SPredicate
{
      const long* _rowBegin;
      SPredicate(const vector<long>& v) : _rowBegin( v.begin() ) { }
      bool operator()(int i, int j) { return _rowBegin[ i ]  <  _rowBegin[ j ] ; }
};
What would the ouput be of the following?
std::sort(A.begin(), A.end(),SPredicate(B));


0
Comment
Question by:CTPAS
  • 3
  • 2
5 Comments
 
LVL 40

Expert Comment

by:evilrix
ID: 21751489
The predicate is indexing B and comparing B using the current value of i and j (both of which will be values of A); however, all elements in B are 1 so I'd expect that A would remain in the same order as it was initially.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 21751551
^^^this assumes that the iterator of a vector is convertible to a type T *, which the C++ Standard doesn't as far as I can remember, define.
0
 

Author Comment

by:CTPAS
ID: 21751616
Thanks for quick resonse
0
 
LVL 40

Accepted Solution

by:
evilrix earned 125 total points
ID: 21751737
I believe this example code implements what your Q asks, yes? The output is what I stated I'd expect in my initial response, "...I'd expect that A would remain in the same order as it was initially"

Do you understand why this is the case though?
#include <vector>
#include <algorithm>
#include <iostream>
 
typedef std::vector<int> intvec_t;
typedef std::vector<long> longvec_t;
 
struct SPredicate
{
	longvec_t::const_iterator _rowBegin; 
	SPredicate(longvec_t & v) : _rowBegin( v.begin() ) { } 
	bool operator()(int i, int j) { return _rowBegin[ i ]  <  _rowBegin[ j ] ; } 
};
 
 
int main()
{
	int  aA[] = {5,6,7,8,9,0,1,2,3,4};
	long aB[] = {1,1,1,1,1,1,1,1,1,1};
 
	intvec_t A(aA, (aA+10));
	longvec_t B(aB, (aB+10));
 
	std::sort(A.begin(), A.end(), SPredicate(B));
 
	std::copy(A.begin(), A.end(), std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;
 
	std::copy(B.begin(), B.end(), std::ostream_iterator<long>(std::cout, " "));
	std::cout << std::endl;
}

Open in new window

0
 

Author Closing Comment

by:CTPAS
ID: 31465747
yes. I was only unclear about where i , j came from in the comparison.
This method is a compact way to order set A elements based on the ordering of set B
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Building cUrl in Windows v7.43.0 4 39
convert char array to number in c 5 91
Best book to learn C++ 4 87
show out valin of json for debugging in visaul c++ 1 48
Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question