将列表转换为向量的最佳方法是什么?
我正在考虑一个循环。但是,也许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是否支持类似的功能...
答案 0 :(得分:10)
std::vector
的一个构造函数(实际上,对于任何标准容器)都带有一对迭代器:
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
所以您可以这样做:
vector<string> v(list_string.begin(), list_string.end());
答案 1 :(得分:2)
您可以使用std::copy
将元素复制到向量中:
pip list --outdated | Select-Object -ExpandProperty Package | Where-Object { $exclude -notcontains $_ } | ForEach { pip install -U $_}
答案 2 :(得分:0)
“转换”有点含糊。首先考虑复制。由于var obj = {
name: 'TestName',
func: function() {
console.log(this)
setTimeout(() => console.log(this), 1000)
}
}
obj.func() //{name: "TestName", func: ƒ}
在C ++ 11中为O(1),因此将list::size()
复制到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
这将通过移动字符串避免额外的堆分配。