从int []转换为list <int>:更好的方法

Roh*_*ain 1 c++ arrays list vector c++11

我有一个整数数组,如下所示:

int ia[] = {1, 2, 3, 4, 5, 6};
Run Code Online (Sandbox Code Playgroud)

我想将它转换为a list<int>和a vector<int>.我想到的显而易见的方法是迭代数组,并将元素添加到list<int>和vector<int>:

for (auto val: ia) {
    ilist.push_back(val);
    ivec.push_vack(val);
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道,是否还有其他任何方式,可能是任何可用的库函数?

jua*_*nza 11

您可以使用双迭代器构造函数:

std::list<int> ilist(std::begin(ia), std::end(ia));
std::vector<int> ivec(std::begin(ia), std::end(ia));
Run Code Online (Sandbox Code Playgroud)

如果你没有对C++ 11的支持std::begin和std::end,你可以使用

std::list<int> ilist(ia, ia + 6);
Run Code Online (Sandbox Code Playgroud)

在实际代码中,您的目标是提供数组长度函数而不是6显式使用.

更妙的是,你可以作用你自己begin和end函数模板,例如

template< class T, std::size_t N >
T* my_end( const T (&a)[N] )
{
  return &a[N];
}
Run Code Online (Sandbox Code Playgroud)

编辑这里是一个数组长度函数模板:

template< class T, size_t N >
std::size_t size( const T (&)[N] )
{
  return N;
}
Run Code Online (Sandbox Code Playgroud)

  • 有一个用于编写自己的`my_end`和`my_begin`甚至可以发布C++ 11 - 调用`std :: begin`的"正确"方法是`使用std :: begin; begin(c);`这样你做的ADL与`for(:)`循环的工作方式相匹配.在许多情况下,做两步舞是很烦人的:所以我倾向于有一个开始/结束助手,一步为我做. (2认同)