I'm creating a class and I want to know how to create a constructor similar to the std::map
or std::vector
style.
std::map<std::string, std::string> map = {
{"foo", "bar"},
{"biz", "buz"},
{"bez", "boz"}
};
The difference is that I don't want my class to ask for types that wants to accept, just like std::map
does.
std::map<std::string, std::string>
I want my class to accept that style of arguments:
{
{"foo", "bar"},
{"biz", "buz"},
{"bez", "boz"}
};
But with defined type. (std::string, Typer)
The 'Typer' is a class that I will insert as value on the std::map
.
One alternative would be to use flat_map from Boost. Containers: that supports the same interface as std::map , but is backed by a sorted contiguous array (think std::vector ) instead of a tree.
A vector has constant time lookup, while std::map is usually implemented as a RB tree, which has a O(log n) look-up time, and even a hash map (such as TR1 unordered_map) usually has a worse complexity, because the index (or a hash thereof) will be mapped to a bucket that can contain multiple values.
Copy constructor is used to copy a whole existing map and the map to be copied is passed as a single param to the constructor.
In C++ we can use arrays or vector as a key against to a int value like: map<vector<int> ,int > m; Can I do same in MATLAB by containers.
If I understand your question correctly, you want a constructor taking std::initializer_list<std::pair<std::string, Typer>>
, like this:
struct Typer
{
std::string data;
Typer(const char *s) : data(s) {}
};
struct MyClass
{
MyClass(std::initializer_list<std::pair<std::string, Typer>> i)
: myMap(begin(i), end(i))
{}
std::map<std::string, Typer> myMap;
};
int main()
{
MyClass m = {
{"foo", "bar"},
{"biz", "buz"},
{"bez", "boz"}
};
}
Live example
typedef std::map<std::string, Typer> MyType;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With