如何在一个表达式中创建初始化向量?

时间:2018-02-02 20:17:06

标签: c++ stl tbb

我想在不声明新变量的情况下创建一个初始化容器(如矢量或列表)?

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net40;netstandard1.3;netstandard2.0</TargetFrameworks>
    <!-- ... -->
    <Configurations>Debug;Release;Installer</Configurations>
  </PropertyGroup>

  <ItemGroup Condition=" '$(TargetFramework)'=='net40' ">
    <!-- ... -->
    <PackageReference Include="docfx.console" Version="2.30.0" Condition="'$(Configuration)|$(Platform)'=='Installer|AnyCPU'" />
  </ItemGroup>

    <!-- ... -->
</Project>

相反,我喜欢这样的事情:

std::vector<int> v;
v.push_back(1);
tbb::parallel_do(v, lambda);

2 个答案:

答案 0 :(得分:3)

tbb::parallel_do是一个模板,第一个参数是裸模板参数。结合{1}不是表达式而没有类型的事实,没有办法推导出模板参数,因此这是不可能的。

但是,std::vector有一个构造函数采用std::initializer_list,这意味着您可以使用元素列表直接初始化向量。这反过来意味着你可以写:

tbb::parallel_do(std::vector{1}, lambda);

临时向量将包含您在原始示例中添加的唯一元素。大多数容器支持这种初始化,所以对于大多数容器你应该没问题。如果由于某种原因你想要的那个没有,你可以创建一个帮助你的功能。

答案 1 :(得分:2)

您可以使用std::vector's constructor的以下重载。

explicit vector( size_type count, 
                 const T& value = T(),
                 const Allocator& alloc = Allocator());

以下是如何使用它。

tbb::parallel_do(std::vector<int>(1, 1), lambda);