【问题标题】:Memset on vector C++向量 C++ 上的 Memset
【发布时间】:2009-11-03 03:13:12
【问题描述】:

对于 C++ 中的向量,有没有 memset 的等效函数?

(不是clear()erase()方法,我想保留vector的大小,我只是想初始化所有的值。)

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    使用std::fill():

    std::fill(myVector.begin(), myVector.end(), 0);
    

    【讨论】:

    • 如果您担心效率,大多数 STL 实现都会有专门的 std::fill 实现,在可能的情况下执行 memset。
    • @razeh 目前,gcc 需要-O3 来优化填充,使其与 memset 一样快。 Clang 只需要-O2。 (stackoverflow.com/a/51274937/5267751)
    【解决方案2】:

    如果您的向量包含POD 类型,则在其上使用 memset 是安全的 - 向量的存储保证是连续的。

    memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
    

    编辑:很抱歉给你一个未定义的术语 - POD 代表 Plain Old Data,即 C 中可用的类型以及由它们构建的结构。

    再次编辑: 正如 cmets 中所指出的,即使 bool 是一种简单的数据类型,vector<bool> 也是一个有趣的例外,如果您尝试在其上使用 memset,将会惨遭失败. Adam Rosenfield's answer 在这种情况下仍然可以正常工作。

    【讨论】:

    • 真的吗?我认为vector 的内存必须是连续的,这是常识。这只是谣言吗?
    • @GMan:是的。在ftp.research.att.com/dist/c++std/WP/CD2/body.pdf 处查看 C++03 草案标准的第 23.2.4 节。它没有提到连续存储。
    • 在我的 ISO03 标准副本中,第 489 页 [23.2.4],它说:“vector 的元素是连续存储的,这意味着如果 v 是 vector<T, Allocator>,其中T 是除bool 之外的某种类型,那么它对所有0 <= n < v.size() 都服从标识&v[n] == &v[0] + n。”我认为这意味着连续,对吧?
    • 我的印象是当前标准可以保证连续存储 - 请参阅stackoverflow.com/questions/247738/…
    • @Adam Rosenfield:您可能会考虑字符串是否连续。至于向量,“连续性实际上是向量抽象的一部分。它是如此重要,以至于当发现 C++98 标准并不能完全保证连续性时,C++03 标准被修改为明确添加保证”来自herbsutter.wordpress.com/2008/04/07/…
    【解决方案3】:

    你可以在vector中使用assign方法:

    将新内容分配给向量,替换其当前内容,并相应地修改其大小(如果您不更改向量大小,只需传递 vec.size() )。

    例如:

    vector<int> vec(10, 0);
    for(auto item:vec)cout<<item<<" ";
    cout<<endl;
    // 0 0 0 0 0 0 0 0 0 0 
    
    // memset all the value in vec to 1,  vec.size() so don't change vec size
    vec.assign(vec.size(), 1); // set every value -> 1
    
    for(auto item:vec)cout<<item<<" ";
    cout<<endl;
    // 1 1 1 1 1 1 1 1 1 1
    

    引用: http://www.cplusplus.com/reference/vector/vector/assign/

    【讨论】:

      【解决方案4】:

      另一种说法,我想我是在迈耶斯的书中首先看到的:

      // Swaps with a temporary.
      vec.swap( std::vector<int>(vec.size(), 0) );
      

      它唯一的缺点是它会复制。

      【讨论】:

        【解决方案5】:

        m= 行数 && n== 列数

        vector<vector<int>> a(m,vector<int>(n,0));        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-08
          • 2018-06-08
          • 1970-01-01
          • 1970-01-01
          • 2018-09-29
          • 1970-01-01
          • 1970-01-01
          • 2013-02-10
          相关资源
          最近更新 更多