将 memset 用于特定行的二维数组

Posted

技术标签:

【中文标题】将 memset 用于特定行的二维数组【英文标题】:Use memset for 2d array at specific row 【发布时间】:2021-03-23 08:53:04 【问题描述】:

最近,我了解了C++。特别是我了解了memset函数。但我不知道如何在特定行为 2d array 设置值

例子:

int dp[10][10];

// I want to set all values for dp[0] by using memset
// I can do it, by using For loop, like 
for (int i = 0; i < 10; i++) 
    dp[0][i] = 1000;

我试过了

memset(dp[0], 1000, sizeof dp[0]);

但效果不好。

所以我想知道是否有任何方法可以像我希望的那样使用 memset?谢谢:D

【问题讨论】:

你为什么要使用memset?启用优化后,编译器会将循环和memset 转换为同一个程序集。您也可以使用 std::array&lt; std::array&lt;int, 10&gt;, 10&gt; 代替 C 数组来简化操作。 您不能使用memset() 来处理比单字节值更大的块。您所拥有的已经是用不同于0 的值初始化该数组的最快方法。 【参考方案1】:

正确的函数是std::fill_n:https://en.cppreference.com/w/cpp/algorithm/fill_n

std::fill_n(std::begin(dp[0]), sizeof dp[0] / sizeof dp[0][0], 1000);

或 C++17 或更高版本:

std::fill_n(std::begin(dp[0]), std::size(dp[0]), 1000);

std::fill 也可以:https://en.cppreference.com/w/cpp/algorithm/fill

std::fill(std::begin(dp[0]), std::end(dp[0]), 1000);

我会这样做:

for (auto &i : dp[0]) i = 1000;

也是最短的版本。

【讨论】:

或者更好地使用std::array开始。【参考方案2】:

您不能这样做,因为 memset 写入字节。 例如memset( dp[0],3,sizeof( dp[0] )) ; 将在 dp[0] 的所有 10 个整数中写入字节 == 3。 所以dp[i] == 0x03030303 for i in 0..9

【讨论】:

以上是关于将 memset 用于特定行的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 初始化指针元素的二维数组

二维字符数组上的 memset

二维数组中的 Memset

对二维数组的“memset”的混淆和“free”的错误

在c++中怎么用memset() 给二维char型数组赋值

二维数组的动态分配(new)初始化(memset)和撤销(delete)