【问题标题】:How to fill a vector with non-trivial initial values?如何用非平凡的初始值填充向量?
【发布时间】:2008-10-16 08:25:41
【问题描述】:

我知道如何用非平凡的初始值填充 std::vector,例如序号:

void IndexArray( unsigned int length, std::vector<unsigned int>& v )
{
    v.resize(length);
    for ( unsigned int i = 0; i < length; ++i )
    {
        v[i] = i;
    }
}

但这是一个 for 循环。有没有一种优雅的方法可以使用 stl 功能(并且使用 Boost)减少代码行数?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    您可以使用 generate 算法来获得更通用的填充容器的方法:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    struct c_unique {
       int current;
       c_unique() {current=0;}
       int operator()() {return ++current;}
    } UniqueNumber;
    
    
    int main () {
      vector<int> myvector (8);
      generate (myvector.begin(), myvector.end(), UniqueNumber);
    
      cout << "\nmyvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    

    这是从cplusplusreference无耻地提取和编辑的。

    【讨论】:

    • 他可能想以 v[i] == i 开头,但稍后在代码中更改。
    • 是的,我希望他能解释一下这个案子。可能有比先填满 em 更好的方法。像一种懒惰的评估方式或其他方式。
    • 我的问题更笼统,因为问题实际上是关于使用非平凡值进行初始化。我确实想用索引号填充数组,以便以后能够排列它们。可能还会有其他解决方案。
    • 正确,已删除问题。也许您可以发布该排列问题?解决方案可能很有趣:)
    • @moog 注意:generate 可能会制作一个 copy 或您提供的函数的副本,此代码可能会生成序列“1 1 1 1 ..”。相反,使用 tr1::ref 传递引用 UniqueNumber 的引用包装器,以避免复制: generate(.. tr1::ref(UniqueNumber) );
    【解决方案2】:

    我通常使用std::generate 加上一个简单的生成器:

    template <typename T>
    struct gen {
        T x;
        gen(T seed) : x(seed) { }
    
        T operator ()() { return x++; }
    };
    
    generate(a.begin(), a.end(), gen<int>(0));
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 SGI STL(或衍生产品,例如 STLPort),您可以使用iota。 :-)

      void IndexArray(unsigned int length, vector<unsigned int>& v)
      {
          vector<unsigned int>(length).swap(v);
          iota(v.begin(), v.end(), 0);
      }
      

      【讨论】:

      • c++11中也有
      【解决方案4】:

      adobe.ASL 中还有一个 iota() 函数(还有一个 value_iterator)。 在 boost 中,有一个 counting_iterator,我怀疑还有其他一些方法可以在 boost 中动态生成数字序列。

      【讨论】:

        【解决方案5】:

        我知道这已经得到解答,但我更喜欢算法库中的“填充”功能,因为它对我来说阅读起来更直观:

        // fill algorithm example
        #include <iostream>
        #include <algorithm>
        #include <vector>
        using namespace std;
        
        int main () {
          vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
        
          fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
          fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0
        
          cout << "myvector contains:";
          for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
            cout << " " << *it;
        
          cout << endl;
        
          return 0;
        }
        

        这也被cplusplusreference无耻地解除了。

        【讨论】:

        • 您将如何使用它来按照要求用渐进式数字填充向量?
        【解决方案6】:

        如果你有一个 C 风格的数组,你可以使用 std:copy,例如,

        int c_array[] = {3,4,5};
        
        const int* pbegin = &c_array[0];
        const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
        const int* pend  = pbegin + c_array_size;
        
        std::vector<int> v;
        v.reserve(c_array_size);
        std::copy(pbegin, pend, std:back_inserter(v));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 2013-10-24
          • 2015-12-26
          相关资源
          最近更新 更多