像许多人一样,我一直在尝试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()?
简而言之,这样做的准则是什么?
我有这样的代码
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) 我有一个这样的课:
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) :我使用的,而不是像功能的标准提供的功能编写包含同一类的子对象的集合,并想遍历和索引一类,通过它们first(),next(),previous(),last(),getchild(x)等。
在c ++ 14中,在所有情况下都必须实现哪些函数以使类可迭代/可索引?
功能:
begin()cbegin()rbegin()crbegin()end()cend()rend()crend()浮现在脑海中,尽管不一定全部都需要实施。也可以选择(为方便程序员):
size()empty()是否还有其他的功能,我必须实现,如预增/减或后递增/递减和数组下标运算符,或者是它真的只是begin()和end()及其变种?