17 #ifndef __defined_libdai_spvector_h
18 #define __defined_libdai_spvector_h
29 template <
typename T1,
typename T2>
30 struct first_less :
public std::binary_function<const std::pair<T1,T2> &, const std::pair<T1,T2> &, bool> {
31 bool operator()(
const std::pair<T1,T2> &a,
const std::pair<T1,T2> &b ) {
return a.first < b.first; }
39 typedef std::pair<size_t, T> nondefault_type;
42 typedef std::vector<nondefault_type> nondefaults_type;
58 spvector() : _p(), _size(0), _def(T()) {}
61 explicit spvector(
size_t n, T p ) : _p(), _size(n), _def(p) {}
72 template <
typename TIterator>
73 spvector( TIterator begin, TIterator end,
size_t sizeHint, T def=T() ) : _p(), _size(0), _def(def) {
77 for( TIterator it = begin; it != end; it++, iter++ )
79 push_back( iter, *it );
92 spvector(
const std::vector<S> &v,
size_t sizeHint, T def=T() ) : _p(), _size(v.size()), _def(def) {
95 for(
size_t i = 0; i < v.size(); i++ )
104 typedef typename nondefaults_type::const_iterator const_iterator;
106 typedef typename nondefaults_type::iterator iterator;
108 typedef typename nondefaults_type::const_reverse_iterator const_reverse_iterator;
110 typedef typename nondefaults_type::reverse_iterator reverse_iterator;
113 iterator begin() {
return _p.begin(); }
115 const_iterator begin()
const {
return _p.begin(); }
118 iterator end() {
return _p.end(); }
120 const_iterator end()
const {
return _p.end(); }
123 reverse_iterator rbegin() {
return _p.rbegin(); }
125 const_reverse_iterator rbegin()
const {
return _p.rbegin(); }
128 reverse_iterator rend() {
return _p.rend(); }
130 const_reverse_iterator rend()
const {
return _p.rend(); }
136 void reserve(
size_t n ) { _p.reserve( n ); }
139 size_t size()
const {
return _size; }
142 void resize(
size_t n ) {
145 if( _p.back().first >= n ) {
146 iterator it = lower_bound( _p.begin(), _p.end(), std::make_pair(n, T()), first_less<size_t, T>() );
147 _p.resize( distance( _p.begin(), it ) );
153 iterator erase( iterator position ) {
154 return _p.erase( position );
159 void push_back(
size_t idx, T val ) { _p.push_back( std::make_pair( idx, val ) ); }
162 void setDefault( T def ) { _def = def; }
165 T getDefault()
const {
return _def; }
168 void clearNonDef() { _p.clear(); }
171 void set(
size_t i, T val ) {
173 iterator it = lower_bound( _p.begin(), _p.end(), std::make_pair(i, T()), first_less<size_t, T>() );
174 if( (it != _p.end()) && (it->first == i) ) {
185 _p.insert( it, std::make_pair(i, val) );
190 T
get(
size_t i )
const {
192 const_iterator it = lower_bound( _p.begin(), _p.end(), std::make_pair(i, T()), first_less<size_t, T>() );
193 if( (it != _p.end()) && (it->first == i) )
200 T operator[](
size_t i )
const {
return get(i); }
203 bool operator==(
const spvector<T>& q )
const {
204 if( size() != q.size() )
207 for(
size_t i = 0; i < size(); i++ )
208 if( !(
get(i) == q.get(i)) )
214 size_t nrNonDef()
const {
return _p.size(); }
217 size_t nrDef()
const {
return _size - _p.size(); }
220 T def()
const {
return _def; }
223 void setDef( T def ) { _def = def; }
226 const nondefaults_type & nonDef()
const {
return _p; }
232 std::ostream& operator << (std::ostream& os, const spvector<T> &x) {
234 os <<
"size:" << x.size();
235 os <<
", def:" << x.def();
236 for(
typename spvector<T>::const_iterator it = x.begin(); it != x.end(); it++ )
237 os <<
", " << it->first <<
":" << it->second;