在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo
.我myFoo
偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo
.这是否允许C++标准?
我有这样的事情:
#include <iostream>
namespace N
{
typedef std::pair<int, double> MyPair;
std::ostream& operator << (std::ostream& o, MyPair const & mypair)
{
///
}
}
int main()
{
N::MyPair pr;
std::cout << pr;
}
Run Code Online (Sandbox Code Playgroud)
这自然不起作用,因为ADL找不到operator<<
因为namespace N
与MyPair
(不幸)相关联.Afaik可能不会添加到命名空间std,所以如果我选择operator <<
在std中定义那将是非法的.那么......在这种情况下该怎么办?我不想明确限定operator <<
,也不想写using namespace N
.所以,问题是:
为什么没有std::pair
迭代器?
std::pair
应提供iterator
和const_iterator
以及begin()
和end()
-只为他们的两个成员.
我认为它会很有用,因为我们可以将它们传递给期望迭代的模板化函数,比如vector
或set
.
这有什么缺点吗?
我有一个图表的表示std::vector<std::unordered_set<unsigned>> neighbors
,即顶点是整数,并且对于每个顶点,我们保留一组它的邻居.因此,为了走遍所有的边缘,我会做类似的事情
for (unsigned u = 0; u < neighbors.size(); ++u)
for (unsigned v : neighbors[u])
if (u <= v)
std::cout << u << ' ' << v << std::endl;
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够从中获得同样的效果
for (auto e: g.edges())
std::cout << e.first << ' ' << e.second << std::endl;
Run Code Online (Sandbox Code Playgroud)
其中g
是从类包封neighbors
矢量.
但是,我尝试过的所有东西看起来都非常复杂,我能想到的最好的版本有50行,而且很难看出它是正确的.有一个简单的方法吗?
这是我丑陋的版本:
#include <iostream>
#include <unordered_set>
#include <vector>
typedef unsigned Vertex;
class Graph {
public:
typedef std::unordered_set<Vertex> Neighbors;
std::size_t numVertices() const { return neighbors_.size(); }
Graph(std::size_t n = …
Run Code Online (Sandbox Code Playgroud) 如果我有范围(一对2迭代器)有一种方法为该使用范围写入"for each"循环,而不是原始数组或容器.
像这样的东西:
auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
// ...
}
Run Code Online (Sandbox Code Playgroud) 考虑一下使用情况std::multimap
,我给出了一系列迭代器:
std::unordered_multimap<std::string, MyObject> mymap;
auto& range = mymap.equal_range("some_key");
for (auto& the_pair : range)
{
}
Run Code Online (Sandbox Code Playgroud)
现在,上面的代码不能编译,但我将它用于演示目的.是否可以使用基于范围的for循环与这样的一对迭代器?我不认为这是可能的直接,所以我想我的问题是关于这个用例是否在STL中有一个适配器类.我可以写自己的,但这似乎是一个常见的情况.
如果这不是常见情况,并且STL没有为此类用法提供此类代理或适配器,那么实现它们需要什么?我在想,我需要重载free函数begin
和end
,也定义了一个适配器迭代器类std::pair<T,U>
.我只是对它进行了概念性的尝试,但请告诉我!在此先感谢大家.
我有以下代码,它可以工作,但是 C++20 版本看起来并不比 C++17 版本好多少。我的猜测问题是multimap
equal_range
返回 apair
并且范围无法确定这是一对有效的迭代器。
有没有办法用更短更好的方式来写这个?
#include <iostream>
#include <map>
#include <ranges>
int main() {
std::multimap<bool,int> oddness{{false,2}, {true,3}, {true,47}, {false,74656}};
// nice, does not work:
// oddness.equal_range(true) | std::views::values;
// works:
oddness | std::views::values;
// working code:
auto odds = oddness.equal_range(true);
const auto odds_view = std::views::values(std::ranges::subrange(odds.first, odds.second));
for (const auto& odd : odds_view) {
std::cout << odd << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)