首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++将memset替换为std::fill

c++将memset替换为std::fill
EN

Stack Overflow用户
提问于 2022-04-08 13:00:29
回答 1查看 136关注 0票数 0

你好,我正在尝试将一些旧代码移植到新标准。我有一个

代码语言:javascript
复制
std::complex<double> **data_2D;

我需要把其中的一部分设定为零。我以前做过:

代码语言:javascript
复制
memset( &( data_2D[dims[0]-delta][0] ), 0, delta*dims[1]*sizeof( std::complex<double> ) );

它发出了这样的警告:

代码语言:javascript
复制
clearing an object of non-trivial type 'class std::complex<double>'; use assignment or value-initialization instead

如何用std::fill更改memset?我在双指针中迷失了方向。

下面是一个极简示例:

代码语言:javascript
复制
#include <iostream>
#include <complex>
#include <string.h>

int main() {
    unsigned int dims[2]={10,10};

    std::complex<double> *cdata_ = new std::complex<double>[dims[0]*dims[1]];
    std::complex<double> **data_2D;
    
    data_2D= new std::complex<double> *[dims[0]];
    for( unsigned int i=0; i<dims[0]; i++ ) {
        data_2D[i] = cdata_ + i*dims[1];
        for( unsigned int j=0; j<dims[1]; j++ ) {
            data_2D[i][j] = 0.0;
        }
    }
    
    unsigned int delta=5;
    memmove( &( data_2D[0][0] ), &( data_2D[delta][0] ), ( dims[1]*dims[0]-delta*dims[1] )*sizeof( std::complex<double> ) );
    memset( &( data_2D[dims[0]-delta][0] ), 0, delta*dims[1]*sizeof( std::complex<double> ) );
    
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 13:24:11

你不需要改变任何关于指针的东西。如果使用std::fill_n,只需注意参数的顺序不同,并且元素的数量,而不是字节数,都是预期的:

代码语言:javascript
复制
std::fill_n( &( data_2D[dims[0]-delta][0] ), delta*dims[1], 0 );

然而,&...[0]具有与隐式数组到指针衰减相同的效果,因此可以同时编写它。

代码语言:javascript
复制
std::fill_n( data_2D[dims[0]-delta], delta*dims[1], 0 );

我并不认为拥有data_2D的重要性。只需直接索引cdata_

代码语言:javascript
复制
std::fill_n( cdata_ + (dims[0]-delta)*dims[1], delta*dims[1], 0 );

或者,如果希望一个接口逐行和逐列索引,请将cdata_包装在一个类中,其中包含一个成员函数,该成员函数通过2D索引对数组进行索引。

如果您已经在进行现代化,我还建议您替换new。它应该是一个std::vector

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71797491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档