For example we have a series of numbers [0, 1, 2, ... N]
We need to line them up in reverse order [N, ... 2, 1, 0]
Is it better to use an array or a vector?
If we use a vector then use "swap" or use buffer?
Using "swap":
for (int i = 0; i < NUMBS / 2; i++)
std::swap(vec[i], vec[(NUMBS - 1) - i]);
Using buffer:
int buf;
for (int i = 0; i < NUMBS / 2; i++) {
buf = vec[i];
vec[i] = vec[(NUMBS - 1) - i];
vec[(NUMBS - 1) - i] = buf;
}
I wrote a little code that demonstrates that an array is faster at this task than a vector:
#include <iostream>
#include <vector>
#include <chrono>
#include <algorithm>
#include <cmath>
#define NUMBS 20000000
std::vector<int> vec;
int arr[NUMBS];
float timeVswap;
float timeVbuf;
float timeAbuf;
class Timer {
private:
using clock_t = std::chrono::high_resolution_clock;
using second_t = std::chrono::duration<double, std::ratio<1> >;
std::chrono::time_point<clock_t> m_beg;
public:
Timer() : m_beg(clock_t::now()) {
}
void reset() {
m_beg = clock_t::now();
}
double elapsed() const {
return std::chrono::duration_cast<second_t>(clock_t::now() - m_beg).count();
}
};
void Vswap() {
Timer t;
t.reset();
for (int i = 0; i < NUMBS / 2; i++)
std::swap(vec[i], vec[(NUMBS - 1) - i]);
timeVswap = t.elapsed();
}
void Vbuf() {
Timer t;
t.reset();
int buf;
for (int i = 0; i < NUMBS / 2; i++) {
buf = vec[i];
vec[i] = vec[(NUMBS - 1) - i];
vec[(NUMBS - 1) - i] = buf;
}
timeVbuf = t.elapsed();
}
void Abuf() {
Timer t;
t.reset();
int buf;
for (int i = 0; i < NUMBS / 2; i++) {
buf = arr[i];
arr[i] = arr[(NUMBS - 1) - i];
arr[(NUMBS - 1) - i] = buf;
}
timeAbuf = t.elapsed();
}
int main() {
Timer t;
for (int i = 0; i < NUMBS; i++) {
vec.push_back(i);
arr[i] = i;
}
Vswap();
Vbuf();
Abuf();
std::cout << "Time for vector (swap): " << timeVswap << " sec.\n";
std::cout << "Time for vector (buf): " << timeVbuf << " sec.\n";
std::cout << "------------------------------------\n";
std::cout << "Time for array (buf): " << timeAbuf << " sec.\n";
std::cout << "\n";
std::cout << "array is faster: " << floorf(100 - timeAbuf / timeVbuf * 100) << " %\n";
return 0;
}
I got results like this: