Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

interval _ map is a data structure that associates keys of type K with values of type V . It is designed to be used

interval_map is a data structure that associates keys of type K with values of type V. It is designed to be used efficiently in situations where intervals of consecutive keys are associated with the same value. Your task is to implement the assign member function of this data structure, which is outlined below.
interval_map is implemented on top of std::map. For more information on std::map, you may refer to cppreference.com.
Each key-value-pair (k,v) in interval_map::m_map means that the value v is associated with all keys from k (including) to the next key (excluding) in m_map. The member interval_map::m_valBegin holds the value that is associated with all keys less than the first key in m_map.
Example: Let M be an instance of interval_map where
M.m_valBegin=='A',
M.m_map=={(1,'B'),(3,'A')},
Then M represents the mapping
...
-2->'A'
-1->'A'
0->'A'
1->'B'
2->'B'
3->'A'
4->'A'
5->'A'
...
The representation in the std::map must be canonical, that is, consecutive map entries must not contain the same value: ...,(3,'A'),(5,'A'),... is not allowed. Likewise, the first entry in m_map must not contain the same value as m_valBegin. Initially, the whole range of K is associated with a given initial value, passed to the constructor of the interval_map data structure.
Key type K
besides being copyable and assignable, is less-than comparable via operator<, and
does not implement any other operations, in particular no equality comparison or arithmetic operators.
Value type V
besides being copyable and assignable, is equality-comparable via operator==, and
does not implement any other operations.
Here is what I have so far!!!
```
#include
template
class interval_map {
friend void IntervalMapTest();
V m_valBegin;
std::map m_map;
public:
// constructor associates whole range of K with val
interval_map(V const& val)
: m_valBegin(val)
{}
// Assign value val to interval [keyBegin, keyEnd).
// Overwrite previous values in this interval.
// Conforming to the C++ Standard Library conventions, the interval
// includes keyBegin, but excludes keyEnd.
// If !( keyBegin < keyEnd ), this designates an empty interval,
// and assign must do nothing.
void assign( K const& keyBegin, K const& keyEnd, V const& val ){
if (!(keyBegin < keyEnd)){
return;
}
auto itLow = m_map.lower_bound(keyBegin);
if (itLow != m_map.begin()){
auto itPrev = prev(itLow);
if (itPrev->second == val){
itLow = m_map.erase(itLow);
}
}
auto itHigh = m_map.lower_bound(keyEnd);
if (itLow != itHigh){
m_map.erase(itLow, itHigh);
}
m_map[keyEnd]= itHigh != m_map.end()? itHigh->second : m_valBegin;
if (m_valBegin != val || keyBegin != m_map.begin()->first){
m_map[keyBegin]= val;
}
if (keyBegin == m_map.begin()->first && m_valBegin == val){
m_map.erase(m_map.begin());
}
}
// look-up of the value associated with key
V const& operator[]( K const& key ) const {
auto it=m_map.upper_bound(key);
if(it==m_map.begin()){
return m_valBegin;
} else {
return (--it)->second;
}
}
};
int main(){
interval_map M('A');
M.assign(1,4,'B');
M.assign(8,9,'C');
for (int i =-2; i <9; ++i){
cout << M[i]<< endl;
}
return 0;
}
// Many solutions we receive are incorrect. Consider using a randomized test
// to discover the cases that your implementation does not handle correctly.
// We recommend to implement a test function that tests the functionality of
// the interval_map, for example using a map of int intervals to char.
```
SEEMS RIGHT BUT I IMPLEMENTED IT WRONG! ->
Unfortunately, this program failed to meet the criterion marked in ***:
*** Type requirements are met: You must adhere to the specification of the key and value type given above.*** THIS FAILED, PLEASE HELP WITH THIS
Correctness: Your program should produce a working interval_map with the behavior described above. In particular, pay attention to the validity of iterators. It is illegal to dereference end iterators. Consider using a checking STL implementation such as the one shipped with Visual C++ or GCC.
Canonicity: The representation in m_map must be canonical.
Running time: Imagine your implementation is part of a library, so it should be big-O optimal. In addition:
Do not make big-O more operations on K and V than necessary because you do not know how fast operations on K/V are; remember that constructions, destructions and assignments are operations as well.
Do not make more than one operation of amortized O(log N), in contrast to O(1), running time, where N is the number of elements in m_map.
Otherwise favor simplicity over minor speed improvements.

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Microsoft Visual Basic 2017 For Windows Web And Database Applications

Authors: Corinne Hoisington

1st Edition

1337102113, 978-1337102117

More Books

Students also viewed these Databases questions