【问题标题】:C++11 lambda array of pointers initializationC++11 lambda 指针数组初始化
【发布时间】:2013-06-06 13:05:31
【问题描述】:

考虑以下代码。我想要做的是从提供的值数组初始化一个指针数组。我试图找出将这些值复制到指针中的最佳方法,并以 C++11 的方式进行。我正在使用 VS2010 编译此代码。

真正困扰我的部分是必须使用外部“i”来获取指针数组的正确索引。我考虑过为此使用 std::array ,但我在使用 std::algorithms (如 for_each )并让它在 VS2010 下编译时遇到了很多麻烦。那可能只是用户错误。

如果有人能告诉我正确编译 VS2010 的语法,我愿意使用 std::array。在 stackoverflow 或其他地方找到 std::array 的好例子时,我运气不佳。我也不完全确定它是否能解决外部“i”的问题。

template <int ArraySize>
class testWithArray
{
   public:
   testWithArray(int* myarray)
   {            
      std::for_each(ArrayOfPointers_, ArrayOfPointers_ + ArraySize, [] (int* arrayElem) 
      {
         arrayElem = new int (0);
      });

      int i = 0;
      std::for_each(myarray, myarray + ArraySize, [&] (int arrayElem)
      {
         *(ArrayOfPointers_[i++]) = arrayElem;
      });
   }
   private:
   int* ArrayOfPointers_[ArraySize];
};



void main()
{
   int plainArray[5] = {0,1,2,3,4};
   testWithArray<5>  myArrayClass(plainArray);
}

【问题讨论】:

    标签: c++ visual-studio-2010 c++11 lambda std


    【解决方案1】:

    我真的不知道您为什么要使用指向整数的指针数组,而不仅仅是整数数组(这是我强烈推荐的),但如果这真的是您需要并且您知道自己在做什么(包括您的程序当前正在泄漏内存的事实),那么您可以使用std::transform() 以这种方式重写您的构造函数:

    #include <algorithm>
    
    // ...
    
    testWithArray(int* myarray)
    {
        std::transform(myarray, myarray + ArraySize, ArrayOfPointers_,
            [] (int arrayElem)
        {
            return new int(arrayElem);
        });
    }
    

    但是,再次考虑一下您是否真的需要一个指针数组。如果你真的需要,那么考虑使用智能指针而不是原始指针(选择最适合你的应用程序所有权策略的模型)。

    【讨论】:

    • 默认的捕获规范“[&]”是不必要的——这个 lambda 没有捕获任何东西。
    • @Casey:正确,这是复制粘贴的剩余部分。已编辑,谢谢
    • 谢谢,这是我需要知道的!
    • @obermeister:很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多