我想迭代一个Set并从集合中删除匹配某些条件的元素.迭代器的文档没有说明在迭代时修改列表.
这可能吗?如果没有,最好的方法是什么?请注意,我只想删除迭代器提供的集合中的元素.
编辑:快速显示这是可能的.我也可以使用以下语法吗?
for(Node n : mySet) {
mySet.remove(n);
}
Run Code Online (Sandbox Code Playgroud) 1)这些生成相同的字节代码吗?
2)如果没有,在某些情况下使用一个是否有任何收益?
// LINQ select statement
return from item in collection
select item.Property;
// foreach in an iterator block
foreach (item in collection)
yield return item.Property;
Run Code Online (Sandbox Code Playgroud) IObjectTest是一个具有单个布尔测试(Object o)方法的接口
FilteringIterator是迭代器的实现,其与另一个迭代器和一个IObjectTest实例初始化:新FilteringIterator(myIterator,MYTEST).然后,您的FilteringIterator将允许迭代'myIterator',但跳过任何未通过'myTest'测试的对象.
由于"hasNext"操作实际上涉及重复移动底层迭代器,直到到达下一个匹配项.问题是如何将it迭代器移回迭代器,因为hasNext不应该移动底层迭代器.
我有一个我想要迭代的元素图.当然,标准的方法是使用for循环
for (map<string, int> iterator it = myMap.begin(); it != myMap.end(); ++it) {
string thisKey = it->first;
int thisValue = it->second;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试使用OpenMP的并行构造使这个循环并行运行,它就不起作用,这显然是一个已知的问题,因为它不能识别这种循环结构.
所以,我的备份计划是使用整数索引迭代器,并按索引访问键和值列表,就像我在C#中所做的那样:
for (int i = 0; i < myMap.Count; ++i) {
string thisKey = myMap.Keys[i];
string thisValue = myMap.Values[i];
}
Run Code Online (Sandbox Code Playgroud)
...但我似乎无法在C++中找到一个等效的方法.有没有办法在C++中做到这一点,我不知道?
我最近开始喜欢自由函数std::next并std::prev显式复制和递增/递减迭代器.现在,我在一个非常具体的案例中看到了奇怪的行为,我很感激任何帮助揭开它的神秘面纱.
我有一个插值/外推功能在boost::any_range一些操作X_type.范围类型的完整定义是:
boost::any_range <
const X_type,
boost::random_access_traversal_tag,
const X_type,
std::ptrdiff_t
>
Run Code Online (Sandbox Code Playgroud)
的any_range,在该特定情况下,从所分配的iterator_range保持两个指针到const X_type,作为一个X_type大约一半的视图data()的一个区域vector<char>.
在MSVC 2010中编译我的应用程序,一切正常.在MinGW g ++ 4.7.0中编译相同的代码,它似乎挂在一个特定的位置,然后我缩小到这个(稍微缩写):
// Previously ensured conditions:
// 1) xrange is nonempty;
// 2) yrange is the same size as xrange.
auto x_equal_or_greater =
std::lower_bound(std::begin(xrange),std::end(xrange),xval);
if (x_equal_or_greater == std::end(xrange))
{
return *yit_from_xit(std::prev(x_equal_or_greater),xrange,yrange);
}
Run Code Online (Sandbox Code Playgroud)
通过在gdb单步调试代码,我发现它没有被卡住,只是走了很长的时间,从单回std::prev电话-这++的libstdc中的条款实施std::advance,最终的+=运营商.
只需将return线替换为:
auto xprev=x_equal_or_greater; …Run Code Online (Sandbox Code Playgroud) 请考虑以下顺序:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Run Code Online (Sandbox Code Playgroud)
我为该序列输入了迭代器.我想将迭代器包装在生成以下序列的迭代器上:
(1,2), (3,4), (5,6), (7,8), (9,10)
Run Code Online (Sandbox Code Playgroud)
如果不清楚,则该序列是来自原始序列的一系列连续元素的连续元素.虽然原始有10个元素,但是这个元素有5个:每个元素都来自原始序列中的两个.
我正在使用Boost iterator_facade实现这一点,我在这方面做了错误的尝试:
template <typename Iterator>
struct pairing_iterator
: boost::iterator_facade<
pairing_iterator<Iterator>,
std::array<typename std::iterator_traits<Iterator>::value_type, 2>,
std::input_iterator_category
// I should probably customize reference too, but it's not relevant
> {
pairing_iterator(Iterator it) : it(it) {
increment(); // A
}
pairing_iterator::value_type dereference() const {
return pair;
}
bool equal(pairing_iterator const& that) const {
return it == that.it; // B
}
void increment() { …Run Code Online (Sandbox Code Playgroud) 我从来没有实现类似STL的迭代器,我试图理解如何基于指针实现一个非常基本的东西.一旦我有了这门课程,我就可以修改它来做更复杂的事情.因此,这是第一步,我需要它坚如磐石才能理解如何编写自己的迭代器(没有boost).
我写了下面的代码,我知道它有错误.你能帮助我正确设计一个受其启发的Random Access Iterator类:
template<Type> class Container<Type>::Iterator : public std::iterator<random_access_iterator_tag, Type>
{
// Lifecycle:
public:
Iterator() : _ptr(nullptr) {;}
Iterator(Type* rhs) : _ptr(rhs) {;}
Iterator(const Iterator &rhs) : _ptr(rhs._ptr) {;}
// Operators : misc
public:
inline Iterator& operator=(Type* rhs) {_ptr = rhs; return *this;}
inline Iterator& operator=(const Iterator &rhs) {_ptr = rhs._ptr; return *this;}
inline Iterator& operator+=(const int& rhs) {_ptr += rhs; return *this;}
inline Iterator& operator-=(const int& rhs) {_ptr -= rhs; return *this;}
inline Type& operator*() {return *_ptr;}
inline …Run Code Online (Sandbox Code Playgroud) 在C++中,我试图std::vector::iterator为我的模板化课程.但是,当我编译它时,我得到错误:error C2146: syntax error : missing ';' before identifier 'iterator',error C4430: missing type specifier - int assumed. Note: C++ does not support default-int.我也收到警告warning C4346: 'std::vector<T>::iterator' : dependent name is not a type:
#include <vector>
template<class T> class v1{
typedef std::vector<T>::iterator iterator; // Error here
};
class v2{
typedef std::vector<int>::iterator iterator; // (This works)
};
Run Code Online (Sandbox Code Playgroud)
我甚至试过了
template<typename T> class v1{
typedef std::vector<T>::iterator iterator;
};
Run Code Online (Sandbox Code Playgroud)
和
template<typename T = int> class v1{
typedef std::vector<T>::iterator …Run Code Online (Sandbox Code Playgroud) 为什么类需要定义__iter__()返回self,以获取类的迭代器?
class MyClass:
def __init__(self):
self.state = 0
def __next__(self):
self.state += 1
if self.state > 4:
raise StopIteration
return self.state
myObj = MyClass()
for i in myObj:
print(i)
Run Code Online (Sandbox Code Playgroud)
控制台日志:
Traceback (most recent call last):
for i in myObj:
TypeError: 'MyClass' object is not iterable
Run Code Online (Sandbox Code Playgroud)
迭代器是具有next(Python 2)或
__next__(Python 3)方法的对象.
添加以下内容的任务:
def __iter__(self):
return self
Run Code Online (Sandbox Code Playgroud)
是返回定义方法的迭代器或类的对象__next__().
但是,当MyClass在myObj = MyClass()行中实例化时,不是返回MyClass对象(定义__next__()方法)的任务,而是由__new__()MyClass实例化了吗?
类定义__next__()方法的对象不是自己的迭代器吗?
我已经研究了问题__iter__方法中返回self的用途是什么?并构建一个基本的Python迭代器,但我仍然无法理解 …
我正在实现一个迭代器,它迭代生成器函数的结果,而不是内存中的数据结构,如矢量或映射.
通过阅读C++ 17§27.2.3 的最终工作草案,输入迭代器(以及扩展名,大多数其他迭代器) 的解引用运算符的返回类型需要一个前向迭代器作为引用.这适用于迭代器迭代的数据结构中存在的项.但是,因为我没有使用数据结构并且在调用取消引用运算符时计算每个项目,所以我没有返回的有效引用; 当操作员返回时,计算的项目将被销毁.为了解决这个问题,我将计算结果存储在迭代器本身并返回对存储结果的引用.这适用于我的用例,但在与任意用户定义类型一起使用时会有自己的问题.
我可以理解允许迭代器返回引用,但为什么这是非变异迭代器的要求?该标准的编写者是否认为生成器和即时转换是迭代器的有效用例?返回值而不是const引用会导致任何实际的伤害吗?
[编辑]:我问的更多的是出于好奇关于为什么标准被写入事情是这样的,因为我已经有一个非常好的解决方法.