将列表转换为向量的最好方法是什么?
我在想一个循环。但也许在C++11中有更好的方法?
#include <list>
#include <string>
#include <vector>
using namespace std;
list<string> list_string {
"one",
"two",
"three"
};
vector<string> vector_string;
for (auto item : list_string) {
vector_string.push_back(item);
}在C#中,我可以使用接受IEnumerable接口的构造函数来初始化另一种数据类型。我很好奇C++11是否支持类似的东西...
发布于 2018-06-27 08:25:22
std::vector (实际上,对于任何标准容器)的一个构造函数接受一对迭代器:
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );所以你可以这样做:
vector<string> v(list_string.begin(), list_string.end());发布于 2018-06-27 14:47:28
您可以使用std::copy将元素复制到向量中:
vector<string> vector_string(list_string.size());
copy(begin(list_string), end(list_string), begin(vector_string));发布于 2018-06-28 02:56:53
“转换”有点模棱两可。首先考虑复制。因为从C++11开始,list::size()是O(1),所以将list<string>复制到vector<string>中的一种相当有效的方法是:
vector<string> vector_string;
vector_string.reserve(list_string.size());
vector_string.assign(list_string.begin(), list_string.end());如果不再需要list_string,可以通过使用std::move_iterator来提高效率(假设字符串足够大,需要一个堆分配),如下所示:
vector<string> vector_string;
vector_string.reserve(list_string.size());
vector_string.assign(move_iterator(list_string.begin()), move_iterator(list_string.end()));这将通过移动字符串来避免额外的堆分配。
https://stackoverflow.com/questions/51052961
复制相似问题