Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 施工期间的非恒定发电机单道初始化_C++_Initialization_Stdvector_Dynamic Memory Allocation_Memory Access - Fatal编程技术网

C++ 施工期间的非恒定发电机单道初始化

C++ 施工期间的非恒定发电机单道初始化,c++,initialization,stdvector,dynamic-memory-allocation,memory-access,C++,Initialization,Stdvector,Dynamic Memory Allocation,Memory Access,有没有一种方法可以通过生成器(类似于)构造函数参数构造一个新的std::vector,该参数可以生成所需的非标准(非常量)值,而无需首先将所有元素初始化为零,从而使用未初始化(非零)值或更漂亮的值来构造新的std::vector?这是因为我希望(随机)模型创建api尽可能具有局部性效率,从而只编写一次容器元素。为std::vector(可能还有其他)提供生成器构造函数不是很好吗?!为什么C++没有将这个添加到标准中? 以下类似构造函数的C函数说明了我为自定义初始化构造std::vector所寻求

有没有一种方法可以通过生成器(类似于)构造函数参数构造一个新的
std::vector
,该参数可以生成所需的非标准(非常量)值,而无需首先将所有元素初始化为零,从而使用未初始化(非零)值或更漂亮的值来构造新的
std::vector
?这是因为我希望(随机)模型创建api尽可能具有局部性效率,从而只编写一次容器元素。为
std::vector
(可能还有其他)提供生成器构造函数不是很好吗?!为什么C++没有将这个添加到标准中?

以下类似构造函数的C函数说明了我为自定义初始化构造
std::vector
所寻求的一次写入行为:

// Allocate-and-Generate a random int array of length \p n.
int * gen_rand(size_t n)
{
  int *v = malloc(n); // allocate only 
  for (size_t i=0; i<n; i++) {
    v[i] = rand(); // first write
  }
}
//分配并生成一个长度为\p n的随机整数数组。
整数*gen\u rand(尺寸)
{
int*v=malloc(n);//仅分配

对于(size_t i=0;i您可以在使用生成器之前调用
vector::reserve
。这将具有与您显示的C代码完全相同的行为。您仍然需要使用
back\u insert\u迭代器,因为
vector
的大小仍然为零

#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <iostream>


int main()
{
  std::vector<int> v;
  v.reserve(10);
  std::generate_n(std::back_inserter(v), 10, []() { return rand(); });
  for(auto x : v)
    std::cout << x << std::endl;
  // unsafe version
  std::vector<int> v2;
  // 10 uninitialized integers
  v2.resize(10);
  // make sure never to write more than the exact amount, otherwise this will be UB
  std::generate_n(v.begin(), 10, []() { return rand(); });

  return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::向量v;
v、 储备(10);
std::generate_n(std::back_inserter(v),10,[](){return rand();});
用于(自动x:v)

std::cout您可以在使用生成器之前调用
vector::reserve
。这将与您显示的C代码具有完全相同的行为。您仍然需要使用
back\u insert\u迭代器,因为
vector
的大小仍然为零

#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <iostream>


int main()
{
  std::vector<int> v;
  v.reserve(10);
  std::generate_n(std::back_inserter(v), 10, []() { return rand(); });
  for(auto x : v)
    std::cout << x << std::endl;
  // unsafe version
  std::vector<int> v2;
  // 10 uninitialized integers
  v2.resize(10);
  // make sure never to write more than the exact amount, otherwise this will be UB
  std::generate_n(v.begin(), 10, []() { return rand(); });

  return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::向量v;
v、 储备(10);
std::generate_n(std::back_inserter(v),10,[](){return rand();});
用于(自动x:v)

std::cout迭代器就是这样做的。看看@EthanSteinberg:std::vector的迭代器解决方案需要使用
push_back()
效率较低或再次导致写入元素两次。对于其他元素,如
std::list
,迭代器可能是一个很好的解决方案。您可以在构造函数中使用迭代器…迭代器就是如何做到这一点的。查看@EthanSteinberg:std::vector的迭代器解决方案需要使用
push_back()这是效率较低或再次导致对元素写入两次。对于其他,例如“代码> STD::列表< /C>”,迭代器可能是一个好的解决方案。在构造函数中可以使用迭代器……也许在C++版本中迭代期间会添加一些关于向量大小检查的附加条件语句,但没有重新分配。Or.@ Nordl OW。向量的大小只会检查推送操作。<代码> Resiths>代码>只检查<代码>容量<代码>。我添加了一个避免这种情况的版本,虽然我认为它不安全。也许在C++版本的迭代过程中会添加一些关于向量大小检查的附加条件语句,但是没有。重新分配。足够接近。@ Nordl OW。向量的大小只会检查推送操作。<代码> Resiths>代码>只检查<代码>容量<代码>。我添加了一个避免这种情况的版本,虽然我认为它不安全。