gpt4 book ai didi

c++ - 将 vector 转换为 initializer_list

转载 作者:IT老高 更新时间:2023-10-28 13:59:00 26 4
gpt4 key购买 nike

每个人都在创造std::vector来自 std::initializer_list ,但是反过来呢?

例如。如果您使用 std::initializer_list作为参数:

void someThing(std::initializer_list<int> items)
{
...
}

有时您的元素放在 vector<T> 中而不是文字列表:

std::vector<int> v;
// populate v with values
someThing(v); // boom! No viable conversion etc.

更普遍的问题是:如何创建 stl::initializer_list来自 STL 可迭代,而不仅仅是 std::vector .

最佳答案

答案是否定的,你不能那样做。

std::initializer_list<T> 类型的对象是一个轻量级代理对象,提供对 T 类型对象数组的访问。A std::initializer_list对象自动构造在以下情况下:

  • 括号初始化列表用于列表初始化,包括函数调用列表初始化和赋值表达式(不要与构造函数初始化列表混淆)
  • braced-init-list 绑定(bind)到 auto,包括在 ranged for 循环中

就库支持而言,std::initializer_list只有一个构造空列表的默认构造函数,并且它的迭代器是常量。缺少一个push_back()成员(member)意味着您不能申请,例如一个 std::copystd::back_inserter迭代器适配器来填充它,你也不能直接通过这样的迭代器分配:

#include <algorithm>
#include <initializer_list>
#include <iterator>
#include <vector>

int main()
{
auto v = std::vector<int> { 1, 2 };
std::initializer_list<int> i;
auto it = std::begin(i);
*it = begin(v); // error: read-only variable is not assignable
}

Live Example

如果您查看标准容器,除了接受 std::initializer_list在它们的构造器/插入器中,它们都有构造器/插入器采用迭代器对,并且实现很可能委托(delegate)initializer_list函数到相应的迭代器对函数。例如。 std::vector<T>::insert function in libc++这是一个简单的单行:

 iterator insert(const_iterator __position, initializer_list<value_type> __il)
{return insert(__position, __il.begin(), __il.end());}

您应该按照类似的方式修改您的代码:

void someThing(std::initializer_list<int> items)
{
someThing(items.begin(), items.end()); // delegate
}

template<class It>
void someThing(It first, It last)
{
for (auto it = first, it != last; ++it) // do your thing
}

当您将项目放在 vector 中而不是文字列表中时:

std::vector<int> v = { 1, 2 };
auto i = { 1, 2 };
someThing(begin(v), end(v)); // OK
someThing(i); // also OK
someThing({1, 2}); // even better

关于c++ - 将 vector<T> 转换为 initializer_list<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com