将std :: set分配给整数

时间:2018-01-23 15:30:51

标签: c++ vector iterator set std

我正在尝试制作一个没有重复数字的整数矩阵,并且它的元素已经排序,所以我用std::vector<std::vector<int>>制作它然后,在互联网和Stackoverflow上搜索,我发现了一个叫{{1我看到的是一个容器,它只有我正在寻找的2个属性:没有重复的元素和排序。酷!

我尝试过的第一件事就是:

std:set

但是我不知道如何初始化它。我尝试过与普通向量相同的方式...类似于 std::vector<std::vector< std::set<int> > > Matrix; 但是它不起作用。

所以我的下一个想法是:

  • 2d矢量矩阵。
  • 带有所有值的std :: set

然后将该组分配给矩阵,以便我可以轻松地使用它,但我仍然遇到很多问题,希望你能帮助我理解我错在哪里......

std::vector<std::vector<int>> Matrix(row, std::vector<int>(col, 0));

我做的另一个尝试是使用函数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

但是它给了我一个错误'错误C2679:二进制'=':没有找到哪个运算符......`

如果我尝试按照

之类的方式在第一个循环中按行排序
    std::copy(SetNumbers.begin(), SetNumbers.end(), Matrix.begin());

然后程序崩溃,我不知道还能尝试什么......

非常感谢你!

PD:另外,另一个问题出现了......我知道使用迭代器是避免使用 std::copy(SetNumbers.begin(), SetNumbers.end(), (*it1).begin()); 的一种方法,但是我可以在双循环中创建类似[] operator的东西吗?

P.D.2:关于排序的澄清

如果我有数字1,2,3,4,5,6,7,8,9,我希望我的矩阵排序为

//Cart[it1][it2].insert(number);

所以我一直在考虑对它进行排序,它会给我一个像:

这样的矩阵
1,4,7
2,5,8
3,6,9

然后交换位置......但也许有更好的方法。

2 个答案:

答案 0 :(得分:0)

首先,通过创建std::vector<std::vector<std::set<int>>>,您可以有效地创建 3维构造。

其次,使用嵌套向量或集合的问题在于它们的唯一性不会与扁平元素绑定 - 它与嵌套向量/集合本身绑定。这意味着您仍然需要检查嵌套容器中的每个元素,以确保它们与其兄弟容器中的元素不同。

最好只使用一个std::set<int>代表您的矩阵,并在其他位置定义其尺寸(因为您已经使用int row=3,col=4完成了)。需要注意的一点是:您必须擦除您要修改的值(通过std::set::erase()),然后重新插入修改后的值,因为这些设置不允许直接修改他们的元素。

使用std::vector<int>也可以,但是正如您所知,默认情况下它们没有排序或唯一。那就是it's fairly trivial to make them sorted and distinct。只有在您不打算修改向量中的许多值时才会建议这样做,因为在添加之后执行排序和区分实际上只是经济有效的您要添加的所有值。每当你修改一个可能变成缓慢混乱的值时,你就必须再次这样做。

答案 1 :(得分:0)

您要做的是将集合中的值复制到矩阵中。

我们可以使用<div class="audio-player-cont"> <div class="logo"> <img src="images/audio-player.png" /> </div> <div class="player"> <div id="songTitle" class="song-title">My Song title will goes here My Song title will goes here My Song title will goes here</div> <input id="songSlider" class="song-slider" type="range" min="0" step="1" onchange="seekSong()" /> <div> <div id="currentTime" class="current-time">00:00</div> <div id="duration" class="duration">00:00</div> </div> <div class="controllers"> <img src="images/previous.png" width="30px" onclick="previous();" /> <img src="images/backward.png" width="30px" onclick="decreasePlaybackRate();" /> <img src="images/pause.png" width="40px" onclick="playOrPauseSong(this);" /> <img src="images/forward.png" width="30px" onclick="increasePlaybackRate();" /> <img src="images/next.png" width="30px" onclick="next();" /> <img src="images/volume-down.png" width="15px" /> <input id="volumeSlider" class="volume-slider" type="range" min="0" max="1" step="0.01" onchange="adjustVolume()" /> <img src="images/volume-up.png" width="15px" style="margin-left:2px;" /> </div> <div id="nextSongTitle" class="song-title"><b>Next Song :</b>Next song title goes here...</div> </div> </div>flattening iterator

执行此操作
std::copy

Ranges TS也可以使用std::copy(SetNumbers.begin(), SetNumbers.end(), flatten(Matrix.begin(), Matrix.end())); 视图

join