我有一个std::set<int>,找到这个集合中最大的int的正确方法是什么?
我有这样的代码:
vector <int> v;
for (int i=0; i<5; i++)
v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());
Run Code Online (Sandbox Code Playgroud)
该代码在第一次检测到2之后从向量v中删除第一个元素(在向量中保留:0 1 2 4)..base()在这做什么?
我正在display()为容器类型创建一个方便的函数模板.最后一个元素的输出与其余元素不同,因此我检查何时myIterator != --cont.cend();.这适用于std::vector,但不适用std::array.为什么?
这是一个MWE(不是我的实际代码):
std::vector<double> vec({1,2});
std::array<double, 2> arr({{1,2}});
auto vecIt = --vec.end(); // OK
auto arrIt = --arr.end(); // error: lvalue required as decrement operand
Run Code Online (Sandbox Code Playgroud) 我需要最后两个元素的别名std::list.最后一个是easy(.back()),但我应该如何获得它之前的那个?
我的第一个想法是:在最后一个元素(.end())之后获取一个迭代器,并将它向左移动两次.以下是我"制作"的内容:
&last_but_one = *----myList.end(),
Run Code Online (Sandbox Code Playgroud)
虽然它有效,但我个人觉得它有点混淆,如果我在别人的代码1中看到它,我认为我不会轻易解析它.
通过这个答案阅读其他一些(太)详细的方法2:
auto iter = n.end();
std::advance(iter, -2);
&last_but_one = *iter; // this is overkill!
// weird, and the .next() variant even more
&last_but_one = *std::prev(std::prev(n.end()));
&last_but_one = *++myList.rbegin(); // similar to *----myList.end()
Run Code Online (Sandbox Code Playgroud)
这是首选的方式?
1我可以发表评论,但代码应该是不言自明的.
2可能更慢更复杂,这不应该是选择的主要原因