我正在尝试使用随机数初始化双向量数组(确实是一个矩阵),但我必须对某些内容有所错误,而且我无法在此处或谷歌中找到解决方案。
我有下一个'标准'定义,用0初始化我的矩阵:
案例1:
int num_rows=5, num_cols=7;
std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));
所以,如果我做出类似的东西:
案例2
std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, rand()%100));
我看到rand()%100
被调用一次,如果它返回34
,那么我的所有矩阵都会被这个数字填充。
此时我尝试使用 Case 1 初始化,并尝试使用双重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
}
}
现在在那个循环中,我找不到逐项去的方法并为它们分配一个新值。我很抱歉,因为我很有道理这是一个非常简单的问题,但在谷歌上找不到...
因为it2是我必须使用的var,如果我尝试制作类似下面的内容它不会编译,甚至intellisense也不会让我把''assign'(因为我的反对错误) :
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
是我在这种情况下需要的功能,因为insert会添加新元素或者at
但是我尝试的所有内容都会给我一个错误,我不知道还有什么我可以尝试或者如果我不得不以不同的方式思考它......
非常感谢!!
答案 0 :(得分:4)
迭代器就像指针一样。最简单的方法是在循环中分配*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使用每个元素调用它的函数参数
答案 1 :(得分:2)
我认为你不能为向量构造函数提供随机值,并期望所有元素都有随机值。而是保留向量大小,然后通过解引用适当的迭代器来分配随机值:
#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>>::iterator
,it2
表示单个元素的迭代器,类型为std::vector<int>::iterator
。
答案 2 :(得分:1)
如果我的问题是正确的,那么您正在寻找一种生成随机矩阵的方法(每个元素都是随机的)。
以下是如何执行此操作:
EndPosition