/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
// Example program
#include <iostream>
#include <string>
#include <vector>
//note : this function add results of duplicates lines
template< class PValues, class PResults >
size_t remove_duplicates_rows_impl(PValues first_v,
PResults first_r,
size_t rows,
size_t cols)
{
auto first_v_cp = first_v;
auto last_v = first_v + rows;
for(auto [i, j] = std::tuple{first_v, first_r}; i != last_v; ++i, ++j)
{
if(equal(first_v, last_v, cols, rows, 1))
{
if(first_v!=i) //self move assignement -> undefined behaviour
{
for(size_t c=0; c<cols; ++c)
{
*(first_v + c*rows) = std::move(*(i + c*rows));
}
*(first_r) = std::move(*j);
}
++first_v;
++first_r;
}
else
{
*(j+1) += *j;
}
}
// Shift values
shift(first_v_cp, first_v, rows, cols);
return rows;
}
template< class PValues >
inline PValues shift(PValues first,
PValues current,
size_t& rows,
size_t cols)
{
size_t tmp = static_cast<size_t>(current - first); // set the new size of the columns
if(tmp==rows) return first + cols*rows; // nothing to do here
// We shift
for(size_t s=1;s<cols;++s)
for(size_t ns=0; ns<tmp; ++ns)
{
*current++ = std::move(*(first + s*rows + ns));
}
rows = tmp;
return current;
}
int main()
{
std::vector<std::string> vec = {"1","1","1","2","2","2","3","8","8",
"5","5","2","5","5","5","6","8","8",
"3","3","3","4","4","3","9","8","8"};
std::vector<double> nbs = {1,2,3,4,5,6,7,8,9};
for(const auto& v : vec)
std::cout << v << " " << std::endl;
for(const auto& v : nbs)
std::cout << v << " " << std::endl;
}
// Example program
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
template<class PValues>
inline bool equal(PValues it,
PValues last,
const std::vector<size_t>& cols_idx,
size_t rows,
size_t offset)
{
if(std::distance(it,last)<offset)
return false;
for(size_t s=0; s<cols_idx.size(); ++s)
{
auto p = it + cols_idx[s]*rows;
if(*p != *(p + offset))
return false;
}
return true;
};
template<class PValues>
inline bool equal(PValues it,
PValues last,
size_t cols,
size_t rows,
size_t offset)
{
if(std::distance(it,last)<offset)
return false;
for(size_t c=0; c<cols; ++c)
{
auto p = it + c*rows;
if(*p != *(p + offset))
return false;
}
return true;
};
template< class PValues >
inline PValues shift(PValues first,
PValues current,
size_t& rows,
size_t cols)
{
size_t tmp = static_cast<size_t>(current - first); // set the new size of the columns
if(tmp==rows) return first + cols*rows; // nothing to do here
// We shift
for(size_t s=1;s<cols;++s)
for(size_t ns=0; ns<tmp; ++ns)
{
*current++ = std::move(*(first + s*rows + ns));
}
rows = tmp;
return current;
}
//note : this function add results of duplicates lines
template< class PValues, class PResults >
size_t remove_duplicates_rows_impl(PValues first_v,
PResults first_r,
size_t rows,
size_t cols)
{
auto first_v_cp = first_v;
auto last_v = first_v + rows;
for(auto [i, j] = std::tuple{first_v, first_r}; i != last_v; ++i, ++j)
{
if(equal(first_v, last_v, cols, rows, 1))
{
if(first_v!=i) //self move assignement -> undefined behaviour
{
for(size_t c=0; c<cols; ++c)
{
*(first_v + c*rows) = std::move(*(i + c*rows));
}
*(first_r) = std::move(*j);
}
++first_v;
++first_r;
}
else
{
*(j+1) += *j;
}
}
// Shift values
shift(first_v_cp, first_v, rows, cols);
return rows;
}
int main()
{
std::vector<std::string> vec = {"1","1","1","2","2","2","3","8","8",
"5","5","2","5","5","5","6","8","8",
"3","3","3","4","4","3","9","8","8"};
std::vector<double> nbs = {1,2,3,4,5,6,7,8,9};
remove_duplicates_rows_impl(vec.begin(),
nbs.begin(),
9,
3);
for(const auto& v : vec)
std::cout << v << " " << std::endl;
for(const auto& v : nbs)
std::cout << v << " " << std::endl;
}