More stuff on chapter 2's array stack.
This commit is contained in:
parent
e0d8dc0171
commit
707d033d9f
|
@ -2,8 +2,41 @@
|
|||
*.fasl
|
||||
*.pyc
|
||||
*.o
|
||||
*.pdf
|
||||
.d
|
||||
|
||||
# ignore build systems
|
||||
.ninja_deps
|
||||
.ninja_log
|
||||
*.ninja
|
||||
|
||||
# editor crap
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
|
||||
# data files
|
||||
ods/data/corpus.txt
|
||||
ods/data/cpp
|
||||
ods/data/ods-cpp.tgz
|
||||
ods/data/ods-cpp.pdf
|
||||
|
||||
# autotools junk files
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
compile
|
||||
config.*
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
m4/
|
||||
missing
|
||||
|
||||
ch??ex??
|
||||
*_test
|
||||
*.la
|
||||
*_bench
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"cppcheck.includePaths": ["${workspaceRoot}/ods/src"]
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
# data files
|
||||
data/corpus.txt
|
||||
data/cpp
|
||||
data/ods-cpp.tgz
|
||||
|
||||
# autotools junk files
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
compile
|
||||
config.*
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
m4/
|
||||
missing
|
||||
|
||||
# build artifacts
|
||||
src/*.o
|
||||
src/ch??ex??
|
||||
src/*.la
|
||||
src/*_bench
|
|
@ -1,4 +1,4 @@
|
|||
pkgdata_DATA = corpus.txt ods-cpp/main.cpp
|
||||
pkgdata_DATA = corpus.txt ods-cpp/main.cpp ods-cpp.pdf
|
||||
|
||||
corpus.txt: corpus.txt.gz
|
||||
gzip -d -k $@.gz
|
||||
|
@ -10,3 +10,9 @@ ODS_SAMPLE_CODE_URL := http://opendatastructures.org/ods-cpp.tgz
|
|||
ods-cpp.tgz:
|
||||
if command -v curl 2>&1 > /dev/null ; then curl -L -O $(ODS_SAMPLE_CODE_URL) ; \
|
||||
elif command -v curl 2>&1 > /dev/null ; then wget $(ODS_SAMPLE_CODE_URL) ; fi
|
||||
|
||||
ODS_PDF_URL := http://opendatastructures.org/ods-cpp.pdf
|
||||
ods-cpp.pdf:
|
||||
if command -v curl 2>&1 > /dev/null ; then curl -L -O $(ODS_PDF_URL) ; \
|
||||
elif command -v curl 2>&1 > /dev/null ; then wget $(ODS_PDF_URL) ; fi
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include <iostream>
|
||||
#include <ods/array.h>
|
||||
#include <ods/array_stack.h>
|
||||
using namespace std;
|
||||
using namespace ods;
|
||||
|
||||
int
|
||||
main(void)
|
||||
|
@ -10,5 +12,15 @@ main(void)
|
|||
cout << "a[0] " << a[0] << endl;
|
||||
|
||||
b = a;
|
||||
cout << "a[0] " << a[0] << endl;
|
||||
cout << "b[0] " << b[0] << endl;
|
||||
|
||||
ArrayStack<int> as(5);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
as.set(i, i+1);
|
||||
}
|
||||
as.add(1, 42);
|
||||
cout << "as[0] " << as.get(0) << endl;
|
||||
cout << "as[1] " << as.get(1) << endl;
|
||||
as.remove(0);
|
||||
cout << "as[0] " << as.get(0) << endl;
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __ODS_ODS_ARRAY__
|
||||
#define __ODS_ODS_ARRAY__
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
namespace ods {
|
||||
|
@ -8,14 +9,19 @@ namespace ods {
|
|||
template<typename T>
|
||||
class Array {
|
||||
public:
|
||||
Array(int len) : length(len) { a = new T[length]; }
|
||||
T *a;
|
||||
int length;
|
||||
|
||||
Array(int len) : a(new T[len]), length(len) {}
|
||||
|
||||
T& operator[](int i) {
|
||||
assert(i >= 0 && static_cast<std::size_t>(i) < length);
|
||||
assert(i >= 0 && i < length);
|
||||
return a[i];
|
||||
}
|
||||
|
||||
Array<T>& operator=(Array<T> &rhs) {
|
||||
if (a != nullptr) {
|
||||
delete a;
|
||||
delete[] a;
|
||||
}
|
||||
|
||||
a = rhs.a;
|
||||
|
@ -23,18 +29,12 @@ public:
|
|||
// I don't understand why this is done, but it's how the book defines it.
|
||||
rhs.a = nullptr;
|
||||
|
||||
length = rhs.length;
|
||||
|
||||
// I put this in to prevent segfaults.
|
||||
rhs.length = 0;
|
||||
|
||||
|
||||
length = rhs.length;
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::size_t size(void) { return length; }
|
||||
private:
|
||||
T *a;
|
||||
std::size_t length;
|
||||
};
|
||||
|
||||
} // namespace ods
|
||||
|
|
|
@ -1,18 +1,58 @@
|
|||
#ifndef __ODS_ODS_ARRAY_STACK__
|
||||
#define __ODS_ODS_ARRAY_STACK__
|
||||
|
||||
#include <iostream>
|
||||
#include <ods/array.h>
|
||||
|
||||
namespace ods {
|
||||
|
||||
|
||||
template<typename T>
|
||||
class ArrayStack {
|
||||
int size(void) { return static_cast<int>(this->a->size()); }
|
||||
private:
|
||||
Array<T> a;
|
||||
int n;
|
||||
public:
|
||||
ArrayStack(int len) : n(0), a(Array<T>(len)) {}
|
||||
int size(void) { return a.length; }
|
||||
T get(int i) { return a[i]; }
|
||||
T set(int i, T x) {
|
||||
T y = a[i];
|
||||
a[i] = x;
|
||||
return y;
|
||||
}
|
||||
|
||||
void add(int i, T x) {
|
||||
if (n+1 > a.length) {
|
||||
resize();
|
||||
}
|
||||
|
||||
for (int j = n; j > i; j--) {
|
||||
a[j] = a[j-1];
|
||||
}
|
||||
|
||||
a[i] = x;
|
||||
n++;
|
||||
}
|
||||
|
||||
T remove(int i) {
|
||||
T x = a[i];
|
||||
for (int j = i; j < (n-1); j++) {
|
||||
std::cout << j << "\t" << i << "\t" << a[j] << std::endl;
|
||||
a[j] = a[j+1];
|
||||
}
|
||||
n--;
|
||||
|
||||
if (a.length > 3*n) {
|
||||
resize();
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
void resize(void) {}
|
||||
private:
|
||||
int n;
|
||||
Array<T> a;
|
||||
};
|
||||
|
||||
} // namespace ods
|
||||
|
||||
#endif // __ODS_ODS_ARRAY_STACK__
|
Loading…
Reference in New Issue