2D Vectors

2D Vectors

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