相关疑难解决方法(0)

如何使我的自定义类型与"基于范围的for循环"一起使用?

像许多人一样,我一直在尝试C + 11带来的不同功能.我最喜欢的一个是"基于范围的循环".

我明白那个:

for(Type& v : a) { ... }
Run Code Online (Sandbox Code Playgroud)

相当于:

for(auto iv = begin(a); iv != end(a); ++iv)
{
  Type& v = *iv;
  ...
}
Run Code Online (Sandbox Code Playgroud)

而这begin()只是返回a.begin()标准容器.

但是,如果我想让我的自定义类型"基于范围的循环" - 意识到什么?

如果我只是专注begin()end()

如果我的自定义类型属于命名空间xml,我应该定义xml::begin()还是std::begin()

简而言之,这样做的准则是什么?

c++ customization for-loop c++11

230
推荐指数
5
解决办法
7万
查看次数

为什么没有范围 - 为std :: istream_iterator查找开始和结束的重载?

我有这样的代码

std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
    file.imbue(std::locale(std::locale(), new delimeter_tokens()));
    for(auto& entry : std::istream_iterator<std::string>(file))
    {
        std::cout << entry << std::endl;    
    }
}
file.close();
Run Code Online (Sandbox Code Playgroud)

其中std::istream_iterator<std::string>begin()end() 定义如下

template<class T>
std::istream_iterator<T> begin(std::istream_iterator<T>& stream)
{
    return stream;
}

template<class T>
std::istream_iterator<T> end(std::istream_iterator<T>& stream)
{
    return std::istream_iterator<T>();
}
Run Code Online (Sandbox Code Playgroud)

这也是马克·尼尔森在Dobb博士这里所写的内容.唉,代码无法在我的Visual Studio 2012上使用错误消息进行编译

错误C3312:找不到类型'std :: istream_iterator <_Ty>'的可调用'begin'函数

错误C3312:找不到类型'std :: istream_iterator <_Ty>'的可调用'end'函数

问题:有没有我没有注意到的东西,编译器中的错误(不太可能,但只是以防万一)或......好吧,任何想法?


根据Xeo的建议,这些问题会得到很大的清理.为了提供更多的背景和参考,这与我在Stackoverflow上的另一个问题有关,我想知道如何使基于行的解析比通常的循环更清晰.从互联网上进行了一些编码和检查,我的工作草图如下

std::ifstream file(filename, std::ios_base::in);
if(file.good())
{               
    file.imbue(std::locale(std::locale(), new delimeter_tokens()));
    for(auto& entry …
Run Code Online (Sandbox Code Playgroud)

c++ istream-iterator visual-c++ c++11 visual-studio-2012

10
推荐指数
1
解决办法
2617
查看次数

如何迭代重载operator []的类?

我有一个这样的课:

class C {
private:
    std::unordered_map<char, int> m = {{'a', 1}, {'b', 2}, {'c', 3}};

public:
    int operator[](const char& key) const {
        return m.find(key)->second;
    }
};
Run Code Online (Sandbox Code Playgroud)

是否可以在不修改类的情况下迭代地图元素?

我希望有类似的东西:

for (auto x: c) {
    // x -> a map element
}
Run Code Online (Sandbox Code Playgroud)

c++

8
推荐指数
1
解决办法
488
查看次数

我必须实现哪些函数才能使类可迭代?

:我使用的,而不是像功能的标准提供的功能编写包含同一类的子对象的集合,并想遍历和索引一类,通过它们first()next()previous()last()getchild(x)等。

在c ++ 14中,在所有情况下都必须实现哪些函数以使类可迭代/可索引?

功能:

  • begin()
  • cbegin()
  • rbegin()
  • crbegin()
  • end()
  • cend()
  • rend()
  • crend()

浮现在脑海中,尽管不一定全部都需要实施。也可以选择(为方便程序员):

  • size()
  • empty()

是否还有其他的功能,我必须实现,如预增/减或后递增/递减和数组下标运算符,或者是它真的只是begin()end()及其变种?

c++ iterator c++14

3
推荐指数
1
解决办法
4540
查看次数