How to Convert Set to Vector in C++?

  • 时间:2020-09-27 14:36:16
  • 分类:网络文摘
  • 阅读:118 次
cplusplus How to Convert Set to Vector in C++? c / c++ programming languages tips tricks

cplusplus

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) —

推荐阅读:
少年华罗庚  15届华罗庚金杯少年数学邀请赛初赛试题及解答  15届华杯赛初赛试题解析(二)  15届华杯赛小学初赛试题解析(三)  数学家苏步青的自述  关于负数的知识  第15届华杯赛决赛小学组试题解析一(A卷)  第15届华杯赛决赛小学组试题解析二(A卷)  为什么生活中有那么多圆柱体?  石头的体积 
评论列表
添加评论