How to Convert Set to Vector in C++?

  • 时间:2020-09-27 14:36:16
  • 分类:网络文摘
  • 阅读:139 次
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) —

推荐阅读:
这本书共有多少页?  他们的职业各是什么?  你知道他们的名次吗?  关于逻辑推理的故事  求一个数是另一个数的几分之几,为什么要用第一个数除以第二个数?  这筐苹果至少有多少个?  最终得到的一位数是多少?  怎样才能全部过河?  最多多少页?最少多少页?  欧拉公式F+V-E=2 
评论列表
添加评论