使用随机值初始化二维向量

Initializing a 2D vector with random values

我正在尝试用随机数初始化一个双向量数组(实际上是一个矩阵),但我一定是哪里出错了,我无法在这里或 google 中找到解决方案。

我有下一个 'standard' 定义,它将我的矩阵初始化为 0:

案例一:

 int num_rows=5, num_cols=7;
 std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));

所以如果我做这样的事情:

案例二

      std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, rand()%100));

我看到 rand()%100 被调用了一次,所以如果它 returns 34 那么我所有的矩阵都将被这个数字填充。

那时我已经尝试使用 Case 1 初始化和 double for 以及这样的迭代器:

for ( std::vector<std::vector<int>>::iterator it1 = Matrix.begin(); it1 != Matrix.end(); ++it1 )
{
    for ( std::vector<int>::iterator it2 = (*it1).begin(); it2 != (*it1).end(); ++ it2 )
    {
        std::cout << (*it2) << "\n"; //With that I can see every value on the matrix... right now all 0 

    }
}

现在在那个循环中,我找不到逐项进行并为它们分配新值的方法。很抱歉,这是一个非常简单的问题,但在 google ...

上找不到

因为 it2 是我必须使用的 var,如果我尝试制作类似上面的下一个内容,它不会编译,甚至智能感知也不会让我输入 'assign'(因为我集会错了 ofc):

it2.assign(...) 
(*it2).assign(...)
it1->assign // Here intellisense works but i don't think this it my option.
//
Matrix(it2,rand()%100); // error

Matrix[it1][it2] = rand() % 100; // Desperate...like normal array?
Matrix.at(it2) = rand()%100;  
Matrix.at(it1).at(it2) = rand() % 100;

我假设 assign 是我在这种情况下需要的函数,因为插入将添加新元素或者可能 at 但我尝试的一切都给我一个错误,我不知道还有什么我可以试试吗,或者我是否必须以不同的方式考虑它...

非常感谢!!

我认为您无法向矢量构造函数提供随机值并期望所有元素都具有随机值。而是保留向量大小,然后通过取消引用适当的迭代器来分配随机值:

#include <iostream>
#include <vector>
#include <random>
#include <iomanip>

int main() {
    std::random_device rd; 
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 100);
    std::vector<std::vector<int>> Matrix(5, std::vector<int>(7, 0));

    for (auto it1 = Matrix.begin(); it1 != Matrix.end(); it1++) {
        for (auto it2 = it1->begin(); it2 != it1->end(); it2++) {
            *it2 = dis(gen); // dereference iterator, set the value
            std::cout << std::setw(4) << *it2;
        }
        std::cout << '\n';
    }
}

此处 it1 表示行的迭代器,类型为:std::vector<std::vector<int>>::iteratorit2 表示单个元素的迭代器,类型为 std::vector<int>::iterator.

迭代器就像指针。最简单的事情就是在你的循环中分配 *it2 = rand() % 100

稍微复杂一点的是使用<algorithm>

中的函数
void fill_row(std::vector<int> & row)
{
    std::generate(row.begin(), row.end(), [](){ return rand() % 100; }); 
}

void fill_matrix(std::vector<std::vector<int>> & mat)
{
    std::for_each(mat.begin(), mat.end(), fill_row);
}

std::generate 将调用其函数参数的结果分配给每个元素。

std::for_each 调用每个元素的函数参数

如果我答对了你的问题,那么你正在寻找一种生成随机矩阵(其中每个元素都是随机的)的方法。
操作方法如下:

int num_rows = 5, num_cols = 7;
// create Matrix filled with 0 (as you mentioned in Case1)
std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));
// Iterating over each row
for (auto it_row = Matrix.begin(); it_row != Matrix.end(); it_row++)
{
    // Getting each (i,j) element and assigning random value to it
    for (auto it_col = it_row->begin(); it_col != it_row->end(); it_col++)
    {
        *it_col = rand() % 100;
    }
}

// let's print the Matrix
for (auto it_row = Matrix.begin(); it_row != Matrix.end(); it_row++)
{
    for (auto it_col = it_row->begin(); it_col != it_row->end(); it_col++)
    {
        std::cout << *it_col << " ";
    }

    std::cout << std::endl;
}