将STL list <string>转换为vector <string> c ++ 11

时间:2018-06-27 00:23:37

标签: c++ c++11 c++17

将列表转换为向量的最佳方法是什么?

我正在考虑一个循环。但是,也许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是否支持类似的功能...

3 个答案:

答案 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

这将通过移动字符串避免额外的堆分配。