Below is a very simple driver code for stack implementation I wrote:
#include <iostream>
#include <string>
#include "stack.h"
#include "vector.h"
void print(stack<std::string, vector<std::string>> stk)
{}
int main()
{
vector<std::string>
v1{"1","2","3","4"},
v2{"Ɐ","B","Ɔ","D","Ǝ"};
stack<std::string, vector<std::string>> s1{std::move(v1)};
stack<std::string, vector<std::string>> s2{std::move(v2)};
print(s1);
print(s1);
print(s2);
}
For some very weird reason, it crashes at runtime complaining about segmentation fault. For even more strange reason, the following works (and so does a few other orderings of print(sx)
statements:
#include <iostream>
#include <string>
#include "stack.h"
#include "vector.h"
void print(stack<std::string, vector<std::string>> stk)
{}
int main()
{
vector<std::string>
v1{"1","2","3","4"},
v2{"Ɐ","B","Ɔ","D","Ǝ"};
stack<std::string, vector<std::string>> s1{std::move(v1)};
stack<std::string, vector<std::string>> s2{std::move(v2)};
print(s1);
//print(s1);
print(s2);
}
In case, you are wondering, why am I using vector
instead of std::vector
; I wrote my own vector
class too. Thanks to Sam Varshavchik comment, the problem might be in the vector
class. This is the link to it: vector
My machine specifications:
- Ubuntu 22.04 LTS
- GCC 11.2.0
- -std = c++11
- Compiled with
g++ main.cc -o main.out
(nothing fancy)
stack.h
#ifndef STACK_H
#define STACK_H
#include <utility>
#include <deque>
template<typename T, class Sequence = std::deque<T>>
class stack
{
public:
typedef Sequence container_type;
typedef typename Sequence::value_type value_type;
typedef typename Sequence::reference reference;
typedef typename Sequence::const_reference const_reference;
typedef typename Sequence::size_type size_type;
stack() : c(Sequence()) {}
explicit stack(const Sequence& __c) : c(__c) {}
explicit stack(Sequence&& __c) : c(std::move(__c)) {}
stack(const stack& __s) : c(__s.c) {}
stack(stack&& __s) : c(std::move(__s.c)) {}
~stack() {}
stack& operator=(const stack& __s)
{
c = __s.c;
return *this;
}
stack& operator=(stack&& __s)
{
c = std::move(__s.c);
return *this;
}
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
reference top() { return c.back(); }
const_reference top() const { return c.back(); }
void push(const value_type& __x) { c.push_back(__x); }
void push(value_type&& __x) { c.push_back(std::move(__x)); }
void pop() { c.pop_back(); }
void swap(stack& __s) { std::swap(c, __s.c); }
inline bool operator==(const stack& __s) { return c == __s.c; }
inline bool operator!=(const stack& __s) { return c != __s.c; }
inline bool operator<(const stack& __s) { return c < __s.c; }
inline bool operator<=(const stack& __s) { return c <= __s.c; }
inline bool operator>(const stack& __s) { return c > __s.c; }
inline bool operator>=(const stack& __s) { return c >= __s.c; }
protected:
Sequence c;
};
#endif
Aucun commentaire:
Enregistrer un commentaire