【发布时间】:2018-07-02 11:42:03
【问题描述】:
我正在尝试制作一个没有重复数字且其元素已排序的整数矩阵,因此我使用std::vector<std::vector<int>> 制作它,但随后在互联网和 Stackoverflow 上搜索,我发现了一个名为 std:set 的东西see 是一个容器,它只有我正在寻找的 2 个属性:没有重复的元素并已排序。酷!
我尝试过的第一件事就是:
std::vector<std::vector< std::set<int> > > Matrix;
但是我不明白如何初始化它。我已经尝试过与法线向量相同的方法......类似于std::vector<std::vector<int>> Matrix(row, std::vector<int>(col, 0)); 但它不起作用。
所以我的下一个想法是:
- 二维向量矩阵。
- 具有所有值的 std::set
然后将该集合分配给矩阵,这样我可能很容易处理它,但我仍然遇到很多问题,希望你能帮助我理解我哪里错了......
int row=3,col=4;
//I create the Matrix and initialize it with 0
std::vector<std::vector<int>> Matrix(row, std::vector<int>(col, 0));
std::set<int> SetNumbers;
for (int i = 0; i < row*col; i++)
SetNumbers.insert((rand() % 100) + 1); // I want to random generate the 12 numbers
std::set<int>::iterator it;
for (it = SetNumbers.begin(); it != SetNumbers.end(); ++it)
cout << "SET: "<<(*it) << endl; // Here I print on screen the numbers of the set
// Lets TRY to assign the set to the 2d vector. I use auto to avoid errors on types
for (auto it1 = Matrix.begin(); it1 != Matrix.end(); ++it1)
{
for (auto it2 = (*it1).begin(); it2 != (*it1).end(); ++it2)
{
*it2 = 4; // That WORKS so maybe with the next line I get what I want...
*it2 = SetNumbers.? // Ofc not... even intellisense doesn't work so bad way
Matrix.assign(SetNumbers.begin(), SetNumbers.end()); // Gives Error and complains about Matrix
(*it2) = SetNumbers[index]; // Discovered that set CAN't be accessed with []
(*it2) = SetNumbers.begin() // Wrong too
}
}
我的另一个尝试是使用函数std::copy
std::copy(SetNumbers.begin(), SetNumbers.end(), Matrix.begin());
但它给了我一个错误 'error C2679: binary '=' : no operator found which take...`
如果我尝试使用类似
的第一个循环内的行进行排序 std::copy(SetNumbers.begin(), SetNumbers.end(), (*it1).begin());
然后程序崩溃了,我不知道我还能尝试什么......
非常感谢!
P.D.:另外,出现了另一个问题......我知道使用迭代器是一种避免使用 [] operator 的方法,但我可以在双循环中制作类似 //Cart[it1][it2].insert(number); 的东西吗??
P.D.2:关于排序的说明
如果我有数字 1、2、3、4、5、6、7、8、9,我希望我的矩阵排序
1,4,7
2,5,8
3,6,9
所以我正在考虑对它进行一般排序,这会给我一个像这样的矩阵:
1,2,3
4,5,6
7,8,9
然后交换位置...但也许有更好的方法。
【问题讨论】:
-
当您说“没有数字重复且元素已排序的矩阵”时,您的意思是按行、按列还是按列排序? std::vector > 适用于按行排序和按列排序。按两者排序,您需要多解释一下您将如何执行它。
-
我完全误解了什么是元素排序的矩阵。你能用例子来演示一下吗?
-
@Jeffrey 我更喜欢按行排序,但如果一般来说,它也可以。我会在几秒钟内澄清一下
-
@S.M.我已经对此进行了澄清:) Ty!
-
也许最好使用
matrix[row][cols]的线性表示为std::vector<int>(row * cols),并通过v[i*cols + j]访问元素(i, j)?在这种情况下,您可以使用 std::sort 算法。
标签: c++ vector iterator set std