我怀疑我在这里做了些蠢事,但我对SPL的一个简单问题感到困惑:
如何使用RecursiveArrayIterator/RecursiveIteratorIterator修改数组的内容(本例中的值)?
使用以下测试代码,我可以使用getInnerIterator()和offsetSet()更改循环内的值,并在循环中转储已修改的数组.
但是当我离开循环并从迭代器转储数组时,它又回到了原始值.发生了什么?
$aNestedArray = array();
$aNestedArray[101] = range(100, 1000, 100);
$aNestedArray[201] = range(300, 25, -25);
$aNestedArray[301] = range(500, 0, -50);
$cArray = new ArrayObject($aNestedArray);
$cRecursiveIter = new RecursiveIteratorIterator(new RecursiveArrayIterator($cArray), RecursiveIteratorIterator::LEAVES_ONLY);
// Zero any array elements under 200
while ($cRecursiveIter->valid())
{
if ($cRecursiveIter->current() < 200)
{
$cInnerIter = $cRecursiveIter->getInnerIterator();
// $cInnerIter is a RecursiveArrayIterator
$cInnerIter->offsetSet($cInnerIter->key(), 0);
}
// This returns the modified array as expected, with elements progressively being zeroed
print_r($cRecursiveIter->getArrayCopy()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C++中实现多态迭代器.基本上,我需要这个能够应用一个过滤器,以便迭代器可以跳过一些项目,具体取决于相关的条件.所以我使用抽象接口创建了一个类似GoF的迭代器,这允许我从中派生一个过滤迭代器并实现所需的逻辑.我也更喜欢基于接口的迭代器而不是模板化的迭代器,因为它们允许隐藏实现而不会导致一堆鸭类模板.
但是,多态迭代器不能通过值返回(与STL迭代器相反),所以我必须传递指针,这很容易变得危险,就像在这种情况下,这似乎是合乎逻辑的,但会导致内存泄漏:
Iter* Collection::GetIter() {...} // new IterImpl
DoSomething(Iter*) {...} // doesn't do delete
DoSomething(Collection.GetIter()); // convenient, but wrong :\
Run Code Online (Sandbox Code Playgroud)
显而易见的解决方案是使用某种智能指针来控制迭代器的生命周期,但人们常说接口应该尽可能简单和通用,因此应该避免使用智能指针?
如果你在C++中使用过多态迭代器,那么这个问题是如何解决的?或者基于模板的迭代器是C++中唯一"好"的迭代方式?谢谢.
我想知道是否有这样的方法通过扩展为java中的每个循环迭代多个集合.
所以类似于:
for (Object element : collection1, collection2, ....)
// do something ...
Run Code Online (Sandbox Code Playgroud)
谢谢
我理解日期是如何工作的,有一个例外,有没有办法从日期周期中找出有多少个区间?
例如:
// define the period of the range
$period = new DatePeriod($begin, $rangeType, $end);
// iterate through the dates in range
foreach ( $period as $dt ) {
}
Run Code Online (Sandbox Code Playgroud)
这是我想从上面的代码做的事情:
echo count($period);
Run Code Online (Sandbox Code Playgroud)
基本上我想知道foreach循环结束运行的时间.
通常的STL结构是:
vector<string> col;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(col));
Run Code Online (Sandbox Code Playgroud)
我们使用an istream_iterator从std input(cin)复制到向量.
谁能解释一下这段代码的工作原理
我的问题是我真的不明白这一部分:
istream_iterator<string>(cin), istream_iterator<string>()
Run Code Online (Sandbox Code Playgroud) 它在C++ Primer中有说明
在C++中,指针和数组紧密交织在一起.特别是,正如我们将看到的,当我们使用数组时,编译器通常会将数组转换为指针.
我想使用迭代器来打印数组.下面的程序运行正常但是当我尝试打印时,arr2或者arr3如果我没有弄错,哪种类型int *,我得到一个错误(判断&运算符意味着下面的参考).
error: no matching function for call to ‘begin(int*&)’
int main(int argc, char** argv) {
int arr[] = {0,1,2,3,4,5,6,7,8,9};
auto arr2 = arr;
auto arr3(arr); // I think arr2 and arr3 are of same type
for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
std::cout << *it << " ";
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
考虑到该语句,如果数组被编译器转换为指针,该程序如何用于打印arr使用的内容,std::begin()并且std::end() 不起作用arr2或者 …
我正在尝试使用以下代码片段将对矢量转换&str为a HashMap:
use std::collections::HashMap;
fn main() {
let pairs = vec!(("foo", "bar"), ("toto", "tata"));
let map: HashMap<&str, &str> = pairs.iter().collect();
println!("{:?}", map);
}
Run Code Online (Sandbox Code Playgroud)
但是编译失败并出现此错误:
<anon>:5:47: 5:56 error: the trait `core::iter::FromIterator<&(&str, &str)>` is not implemented for the type `std::collections::hash::map::HashMap<&str, &str>` [E0277]
<anon>:5 let map: HashMap<&str, &str> = pairs.iter().collect();
Run Code Online (Sandbox Code Playgroud)
但是,如果我.cloned()在调用之前添加collect()一切正常:
...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
Run Code Online (Sandbox Code Playgroud)
即使我理解错误消息(没有FromIterator<&(&str, &str)>该类型的特征的实现HashMap<&str, &str>)我不明白类型&(&str, &str)来自哪里(根据Rust文档中的方法签名)以及为什么调用cloned()修复这个问题.
我有一个模板函数,我想在其中生成一个未知类型的向量.我试图让它自动,但编译器说它是不允许的.
模板函数获取迭代器或指针,如后面的main函数中的测试程序中所示.如何解决问题?
template<class Iter>
auto my_func(Iter beg, Iter end)
{
if (beg == end)
throw domain_error("empty vector");
auto size = distance(beg, end);
vector<auto> temp(size); // <--HERE COMPILER SAYS CANNOT BE AUTO TYPE
copy(beg, end, temp->begin);
.
.
return ....
}
int main()
{
int bips[] = {3, 7, 0, 60, 17}; // Passing pointers of array
auto g = my_func(bips, bips + sizeof(bips) / sizeof(*bips));
vector<int> v = {10, 5, 4, 14}; // Passing iterators of a vector
auto h …Run Code Online (Sandbox Code Playgroud) 我在ConcurrentSkipListSet上使用了descendingIterator方法.我刚检查了文档并注意到以下注释:
'升序有序视图及其迭代器比下行视图更快.
不幸的是,它没有提供任何关于此的更多信息.有什么样的性能差异?它有意义吗?为什么会有性能差异?
我知道我们可以使用advance()函数来增加迭代器.我们还使用iterator++一个位置来增加迭代器.为什么我们不能使用it+=2?
int main()
{
list<int> l1{1, 2, 3, 5, 6};
list<int> l2{2, 6, 8};
auto it = l1.begin();
advance(it, 2); //works
it++; //works
// it+=2; //not work
l2.splice(l2.begin(), l1, it);
for(int a: l2) cout<<a<<" ";
cout<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处运行上述代码.