我正在尝试为PDO语句的结果编写一个迭代器,但我找不到任何重绕到第一行的方法.我想避免调用fetchAll和存储所有结果数据的开销.
// first loop works fine
foreach($statement as $result) {
// do something with result
}
// but subsequent loops don't
foreach($statement as $result) {
// never called
}
Run Code Online (Sandbox Code Playgroud)
有没有办法重置声明或寻找第一行?
基本上,我有点厌倦写作:
std::map<key_t, val_t> the_map;
...
auto iterator = the_map.find(...);
if(iterator != the_map.end()) { // note the "inversed" logic and logically superflous end() call
...
}
Run Code Online (Sandbox Code Playgroud)
真正有意义的是:
if(auto x=the_map.find(...)) {
... // x could either be an iterator or maybe something like boost::optional<val_t>
}
Run Code Online (Sandbox Code Playgroud)
是否有一些现有技术定义了一些辅助工具来缩短!= container.end()语法,或者我是唯一一个因此而烦恼的人?
我想在c ++中有一个for循环,它在初始化中构造了两种不同类型的向量迭代器.
这是我想要的大致想法:
std::vector<double> dubVec;
std::vector<int> intVec;
double result = 0;
dubVec.push_back(3.14);
intVec.push_back(1);
typedef std::vector<int>::iterator intIter;
typedef std::vector<double>::iterator dubIter;
for (intIter i = intVec.begin(), dubIter j = dubVec.begin(); i != intVec.end(); ++i, ++j)
{
result += (*i) * (*j);
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道在这种情况下要做的标准是什么?我不能只为intVec使用double的向量,因为我正在寻找一个通用的解决方案.[即我可能有一些函数f,它将int加倍,然后计算f(*i)*(*j)]
为何选择STL
std::iterator_traits<const T*>::value_type
Run Code Online (Sandbox Code Playgroud)
与...的类型相同
std::iterator_traits<T*>::value_type
Run Code Online (Sandbox Code Playgroud)
为什么它的设计是这样的?首先不应该是const T而第二个是T吗?你应该如何采用底层const正确类型的迭代器?我知道你可以编写自己的模板类和专业化并从中获取
std::iterator_traits<const T*>::pointer
Run Code Online (Sandbox Code Playgroud)
但不应该有一个成员typedef持有它吗?
我正在读" Think Python:如何像计算机科学家一样思考"这本书,它说在Python 3.x中,dict([list of tuples])返回一个iterator而不是一个list(如Python 2.7中的情况).
这本书没有进一步解释,这让我感到困惑.特别是,我想知道:
迭代器和列表是如何不同的,以及
在列表上返回迭代器有什么好处?
我最近遇到了将指针指向成员应用于迭代器指定的对象的需要.我尝试过自然语法:
ite->*ptr = 42;
Run Code Online (Sandbox Code Playgroud)
令我沮丧的是,它没有编译.迭代器不会过载operator->*,但更令人惊讶的是智能指针也不会.我需要诉诸以下笨拙:
(*ite).*ptr = 42;
Run Code Online (Sandbox Code Playgroud)
试验(参见下面的实例)已经表明,对于自定义类,对于指向成员的指针和指向成员函数的指针,这样的语法似乎是可以实现的,至少从C++ 14开始.
因此:
operator->*,还是仅仅是一种疏忽?operator->*在定义类似指针的类时,我应该重载,还是同样的理由适用于我?实例 - 什么是编译,什么不编译,以及自定义类的概念验证.
将 an 转换Iterator<&str>为 a的规范方法是什么String,穿插一些常量字符串(例如"\n")?
例如,给定:
let xs = vec!["first", "second", "third"];
let it = xs.iter();
Run Code Online (Sandbox Code Playgroud)
有一种方法可以s通过收集到 someIterable并joining 结果来生成字符串:
let s = it
.map(|&x| x)
.collect::<Vec<&str>>()
.join("\n");
Run Code Online (Sandbox Code Playgroud)
但是,这不必要地为Vec<&str>. 有没有更直接的方法?
我想从冻结集中获取一个元素(当然,不修改它,因为frozensets是不可变的).到目前为止我找到的最佳解决方案是:
s = frozenset(['a'])
iter(s).next()
Run Code Online (Sandbox Code Playgroud)
按预期返回:
'a'
Run Code Online (Sandbox Code Playgroud)
换句话说,有没有任何方法可以从冻结集中"弹出"一个元素而不实际弹出它?
我这样做:
const int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
const auto foo = cbegin(arr);
const typename iterator_traits<decltype(foo)>::value_type bar = 1;
Run Code Online (Sandbox Code Playgroud)
我本来期望bar有这种类型int.但相反,我得到一个错误:
错误C2039 ::
value_type不是.的成员std::iterator_traits<_Ty *const >
这是const我需要剥离那个什么的问题吗?