【问题标题】:Converting from int[] to list<int> : Any better way从 int[] 转换为 list<int> :任何更好的方法
【发布时间】:2013-07-06 05:07:01
【问题描述】:

我有一个如图所示的整数数组:

int ia[] = {1, 2, 3, 4, 5, 6};

我想将其转换为 list&lt;int&gt;vector&lt;int&gt;。我想到的明显方法是遍历数组,并将元素添加到list&lt;int&gt;vector&lt;int&gt;

for (auto val: ia) {
    ilist.push_back(val);
    ivec.push_vack(val);
}

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

【问题讨论】:

  • 顺便说一句,std::list 很少是正确的容器。虽然乍一看它看起来像“只需要迭代时应该使用的顺序容器”,但实际上它是“当您需要迭代器来长期保存时应该使用的顺序容器,或者在您执行更多数量级的插入时应该使用的顺序容器/删除中间而不是迭代”。与std::vector 相比,它在性能和功能上都存在缺陷——它使用更多内存并且速度更慢。
  • 感谢@yakk 的宝贵建议。会记住的:)

标签: c++ arrays list c++11 vector


【解决方案1】:

您可以使用两个迭代器的构造函数:

std::list<int> ilist(std::begin(ia), std::end(ia));
std::vector<int> ivec(std::begin(ia), std::end(ia));

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

std::list<int> ilist(ia, ia + 6);

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

更好的是,您可以使用自己的 beginend 函数模板,例如

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

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

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

【讨论】:

  • @juanchopanza。天哪。我正在寻找这个。只是不知道如何获取内置数组的迭代器。谢谢 :) 在接受之前将等待其他一些选项。
  • @juanchopanza 我建议你使用ia + sizeof(ia) / sizeof(ia[0]) 而不是硬编码的长度。
  • @RohitJain,这适用于任何容器。你不会找到更好的。唯一真正更短的方法是auto ivec = contFromArray&lt;std::vector&lt;int&gt;&gt;(ia);,但我觉得没什么意义。
  • @chris。实际上,我知道std::arraystd::vector等之间的转换方法。但是忘记了如何获取内置数组的迭代器。这似乎是目前最方便的方法,直到我了解有关模板的更多信息以及所有内容。谢谢:)
  • 即使在 C++11 之后也可以编写自己的 my_endmy_begin -- 调用 std::begin 的“正确”方式是通过 using std::begin; begin(c); 来实现与 for( : ) 循环的工作方式相匹配的 ADL。在许多情况下,跳两步舞很烦人:所以我倾向于有一个开始/结束助手为我一步完成。
猜你喜欢
  • 2012-11-24
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多