Let’s say our task is to convert a set or unordered_set in C++ to std::vector, what would you do?
Given the following set with integers (or other types)
1 | unordered_set<int> data; |
unordered_set<int> data;
We want to convert it to:
1 | vector<int> target; |
vector<int> target;
Using a Loop to copy a C++ set to std::vector
Intuitively, we can push to the vector one by one, in a loop, by reading the elements in the set.
1 2 3 4 | vector<int> target; for (const auto &it: data) { target.push_back(it); } |
vector<int> target; for (const auto &it: data) { target.push_back(it); }
Alternatively, we can pre-allocate the size of the vector, and use something like this (slightly a bit faster):
1 2 3 4 | vector<int> target(data.size()); for (int i = 0; i < data.size(); ++ i) { target[i] = data[i]; } |
vector<int> target(data.size()); for (int i = 0; i < data.size(); ++ i) { target[i] = data[i]; }
Using vector constructor to convert a C++ set to std::vector
In the constructor of the vector, we can pass the iterator of begin and end for the input set, like below:
1 | vector<int> target(data.begin(), data.end()); |
vector<int> target(data.begin(), data.end());
Using vector.assign to convert a C++ set to std::vector
We can use the std::vector.assign() method that takes the begin and end iterator of the source set/unordered_set – which will allow us to convert/copy a C++ set to std::vector, like below.
1 2 | vector<int> target; target.assign(data.begin(), data.end()); |
vector<int> target; target.assign(data.begin(), data.end());
Using std::copy to copy a C++ set to std::vector
Using std::copy, we can specify the begin and end iterator of the source data to copy from, and the begin iterator of the target data source, like this:
1 2 | vector<int> target(data.size()); std::copy(data.begin(), data.end(), target.begin()); |
vector<int> target(data.size()); std::copy(data.begin(), data.end(), target.begin());
We have to make sure the target data has enough space/storage to copy the data to, thus, the target vector has to be pre-allocated.
Alternatively, we can use the back_inserter that will insert at the end of the target vector, thus no need to allocate the target vector.
1 2 | vector<int> target; std::copy(data.begin(), data.end(), std::back_inserter(res)); |
vector<int> target; std::copy(data.begin(), data.end(), std::back_inserter(res));
–EOF (The Ultimate Computing & Technology Blog) —
loading...
Last Post: Algorithms to Check If Four Points can Make a Valid Square (C++ and Java)?
Next Post: How to Check if Any Three Points can Make a Triangle?