相关疑难解决方法(0)

在C++标识符中使用下划线有哪些规则?

在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.

C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?

c++ standards naming-conventions c++-faq

906
推荐指数
4
解决办法
24万
查看次数

使用另一个命名空间中的typedef进行ADL

我有这样的事情:

#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 NMyPair(不幸)相关联.Afaik可能不会添加到命名空间std,所以如果我选择operator <<在std中定义那将是非法的.那么......在这种情况下该怎么办?我不想明确限定operator <<,也不想写using namespace N.所以,问题是:

  1. 如何重构代码?
  2. 为什么ADL不会关联typedef的名称空间?严重的原因?这会很好,例如在这种情况下.谢谢

c++ typedef argument-dependent-lookup

15
推荐指数
1
解决办法
1596
查看次数

为什么std :: pair没有迭代器?

为什么没有std::pair迭代器?

std::pair应提供iteratorconst_iterator以及begin()end()-只为他们的两个成员.

我认为它会很有用,因为我们可以将它们传递给期望迭代的模板化函数,比如vectorset.

这有什么缺点吗?

c++ stl std-pair

15
推荐指数
1
解决办法
6094
查看次数

使用基于范围的for迭代图的边缘

我有一个图表的表示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)

c++ foreach graph boost-graph c++11

11
推荐指数
2
解决办法
6077
查看次数

可以基于范围的循环工作范围

如果我有范围(一对2迭代器)有一种方法为该使用范围写入"for each"循环,而不是原始数组或容器.

像这样的东西:

auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

c++ foreach c++11

9
推荐指数
1
解决办法
2104
查看次数

是否可以使用基于范围的for循环与迭代器范围?

考虑一下使用情况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函数beginend,也定义了一个适配器迭代器类std::pair<T,U>.我只是对它进行了概念性的尝试,但请告诉我!在此先感谢大家.

c++ stl c++11

4
推荐指数
1
解决办法
2082
查看次数

std::multimap 等于 _range 和 C++20 std::views::values 不能很好地协同工作

我有以下代码,它可以工作,但是 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)

c++ c++20 std-ranges

0
推荐指数
1
解决办法
86
查看次数