#include <vector>
#include <iostream>
using namespace std;
//create row vectors and push_back into main vector
//alternate method using push_back
/*
int main() {
int c=0;
vector< vector<int> > v1;
for (int i=0; i<3; i++)
{
vector<int> v2;
for (int j=0; j<4; j++)
{
v2.push_back(++c);
}
v1.push_back(v2);
}
//print 2d vector
for(unsigned i=0; i<v1.size(); i++)
{
for (unsigned j=0; j<v1[i].size(); j++)
{
cout << v1[i][j] << " ";
}
cout << endl;
}
return 0;
}
*/
// alternate method initializing size then using assignment
int main() {
// initialize size then assign elements
int c=0;
vector< vector<int> > v1 (3, vector <int> (4));
for(unsigned i=0; i<v1.size(); i++)
{
for (unsigned j=0; j<v1[i].size(); j++)
{
v1[i][j]=++c;
}
}
for(unsigned i=0; i<v1.size(); i++)
{
for (unsigned j=0; j<v1[i].size(); j++)
{
cout << v1[i][j] << " ";
}
cout << endl;
}
return 0;
}
Sorting rows by row sum
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
void printmatrix(const vector <vector <int> > V) {
for (auto a: V)
{
int sum=0;
for (auto x: a)
{
cout<<x<<" ";
sum=sum +x;
}
cout <<" = "<<sum<< endl;
}
}
bool mycomp(const vector <int> x, const vector <int> y){
int sumx(0), sumy(0);
for (unsigned int i=0; i<x.size(); i++)
sumx=sumx+x[i];
for (unsigned int i=0; i<y.size(); i++)
sumy=sumy+y[i];
return (sumx < sumy);
}
int main() {
srand(static_cast<unsigned>(time(0)));
vector <vector <int> > v;
for (unsigned int i=0; i< 10; i++)
{
vector <int> a;
for (unsigned int j=0; j < 10; j++)
{
//a.push_back( 10 + (rand()%90) );
a.push_back( 10 + int( 90.0 * rand()/(RAND_MAX+1.0))); //better
}
v.push_back(a);
}
printmatrix(v);
sort(v.begin(), v.end(), mycomp);
cout<<endl;
printmatrix(v);
return 0;
}
A better solution below:
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <random>
using namespace std;
//function prototypes (order of function definitions does not matter)
void printmatrix(const vector <vector <int> > &);
int vecsum(const vector <int> &);
bool mycomp(const vector <int> &, const vector <int> &);
vector <vector <int>> createRandMatrix(uint , uint, int, int );
int randInt(int, int);
int main() {
//srand(static_cast<unsigned>(time(0))); //seeding
vector <vector <int> > M=createRandMatrix(4, 3, 10, 20); //rows, cols, low, high
printmatrix(M);
sort(M.begin(), M.end(), mycomp);
cout<<endl;
printmatrix(M);
return 0;
}
void printmatrix(const vector <vector <int> > &V) {
for (uint i=0; i < V.size(); i++)
{
for (uint j=0; j < V[i].size() ; j++)
{
//cout << V[i][j] << " ";
cout << V.at(i).at(j) << " ";
}
cout <<" = "<< vecsum(V[i]) << endl;
//calling vecsum before definition below is okay since prototype is defined above
}
}
int vecsum(const vector <int> &v){
int sum=0;
for (uint i=0; i<v.size(); i++)
sum = sum + v[i];
return sum;
}
bool mycomp(const vector <int> &v1, const vector <int> &v2){
return (vecsum(v1) < vecsum(v2));
}
int randInt(int low, int high){
//old method random number requires srand(...) seeding
//return low + int( (high-low + 1.0)*rand() / (RAND_MAX+1.0));
//newer C++11 random numbers requires #include <random>
static random_device rd;
static mt19937 rng(rd());
uniform_int_distribution<int> dist(low, high);
return dist(rng);
}
vector < vector <int> > createRandMatrix(uint rows, uint cols, int low, int high){
vector <vector <int> > M;
for (uint i=0; i< rows; i++)
{
vector <int> v;
for (uint j=0; j < cols; j++)
{
v.push_back(randInt(low, high));
}
sort(v.begin(), v.end());
M.push_back(v);
}
return M;
}
Selection Sort Example (both In-place and Not-In-place)
#include <vector>
#include <iostream>
#include <utility> //for swap with c++11
using namespace std;
void myswap(vector <int> &v, uint x, uint y){
int temp=v[x];
v[x]=v[y];
v[y]=temp;
}
uint findmin(const vector <int> &v, uint start=0){ //starts searching at 0 by default
uint mindex = start; //default minimum value index
for(uint x = start+1; x < v.size(); ++x)
{
if (v[x] < v[mindex])
mindex=x;
}
return mindex;
}
void selsortIP( vector <int> &v ){
//in place selection sort
uint mindex;
for(uint i = 0; i < v.size()-1; ++i) //omit last element
{
mindex = findmin(v, i);
//swap(v[i],v[mindex]);
myswap(v, i, mindex);
}
}
vector <int> selsort( vector <int> v ){
vector <int> sorted;
uint mindex;
while (!v.empty()) //while (v.size()>0)
{
mindex = findmin(v);
sorted.push_back(v[mindex]);
v.erase(v.begin()+mindex);
}
return sorted;
}
void printvec(const vector <int> &v){
for (uint x=0; x<v.size();x++)
{
cout<<v[x]<<endl;
}
cout<<endl;
}
int main(){
vector <int> A({7,6,0,2,9,4,1,5,3,8});
vector <int> B;
cout<<"unsorted"<<endl;
printvec(A);
B = selsort(A);
cout<<"sorted not in place"<<endl;
printvec(B);
cout<<endl;
cout<<"unsorted"<<endl;
printvec(A);
selsortIP(A);
cout<<"sorted in place"<<endl;
printvec(A);
return 0;
}