标签: iterator

如果我从 getter 创建迭代器,则程序中止

这是一种奇怪的行为,我不明白我有。

我有一个带有列表的类 a 和一个吸气剂:

class A
{
  private:
   std::list<OtherClass *> l;
  public:
   std::list<OtherClass *> getL()
   {
     return l;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我做类似的事情:

A inst;
std::list<OtherClass *>::iterator itB = inst.getL().begin();
std::list<OtherClass *>::iterator itE = inst.getL().end();
for (; itB != itE; ++itB) // Instant ABORT !
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

A inst;
std::list<OtherClass *> l = inst.getL();
std::list<OtherClass *>::iterator itB = l.begin();
std::list<OtherClass *>::iterator itE = l.end();
for (; itB != itE; ++itB) // It works now !
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么会发生这种情况吗?为什么我必须通过这样的临时变量才能不中止?先感谢您 !

c++ getter iterator

0
推荐指数
1
解决办法
540
查看次数

在循环中从 C# ArrayList 中删除元素的优雅方式是什么?

我对 Java 很满意

ArrayList<String> list = new ArrayList<>();
Iterator<SignalEvent> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();            
    if(s.equals("delete me")){
        it.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

不太高兴,但对 C++ 感觉还可以

std::list<MyObject*> mylist;    
for (list<MyObject*>::iterator it = mylist.begin(); it != mylist.end();)
{
    MyObject* se = (*it);
    if(se->bDelete == true)
        it = mylist.erase(it);
    else
        it++;
}
Run Code Online (Sandbox Code Playgroud)

现在谈到 C#,这是最好的方法吗?

你有迭代器的方式吗?

考虑到性能和可读性,您有更好的建议吗?

for( int i = arrayList.Count - 1; i >= 0; i -- )
{
    if( arrayList[ i ].ToString() == "del" )
    {
        arrayList.RemoveAt( i ); …
Run Code Online (Sandbox Code Playgroud)

c# iterator loops arraylist remove-if

0
推荐指数
1
解决办法
9295
查看次数

使用 std::multimap 是否可以保证 begin() 方法返回最新元素?

我是 C++ 的新手。我想知道:std::multimap(C++11)集合的迭代器中是否有一些插入时间保留?

我认为,因为它是由任意值索引的,所以不能保证迭代器中元素的排序保留插入时间,但我正在处理一些做出不同假设的代码,即返回的元素begin()是相关的到广告订单。

c++ iterator multimap c++-standard-library c++11

0
推荐指数
1
解决办法
222
查看次数

C++迭代向量并删除匹配的字符串

我正在尝试编写字符串列表.用户可以添加到列表或从列表中删除,以及显示当前列表.

显示列表和添加到列表工作正常,但我无法弄清楚如何通过遍历列表来查找匹配来删除用户的字符串.

我如何更改我的代码来解决这个问题? 看看是否(答案== 3)

// InClassAssignment-FavouriteGameList.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    vector <string>  gameList;
    int answer = 0;
    bool cont = true;
    int size = 0;
    vector<string>::iterator iter;
    string addToList;
    string removeFromList;

    cout << "\tGame List" << endl;

    while (cont)
    {
        cout << "--------------------------------------------" << endl;
        cout << "\nWhat …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stdvector

0
推荐指数
1
解决办法
755
查看次数

从 unordered_map 中删除值的有效方法,当只给出值 C++

我有一个名为的抽象类Object,我使用std::unordered_map<int, Object*> objects将这些Objects包含在一个名为DataSet. 每个对象都有一个id与之关联的对象。

通常,当从 my 中删除对象时unordered_map,我可以执行iterator = find(id)然后调用erase该迭代器。

这是简单而有效的。问题是,我必须实现一种方法来按值删除条目/对,而不是按键(这是我的id)。这给了我以下原型:

int DataSet::DeleteObject(Object* object)

实现这一目标的最有效方法是什么?我想我可以做这样的事情:

if(object){
    for(auto kv : objects) {
        if(kv.second == object) {
            objects.erase(kv);
        }
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎非常低效。那么实现这一目标的最有效方法是什么?

c++ iterator unordered-map

0
推荐指数
1
解决办法
6198
查看次数

C++标准是否需要operator!=必须为给定的迭代器类型提供?

C++ 17标准27.2.1.8说:

迭代器j被称为可以从迭代器i到达,当且仅当存在表达式++ i的有限序列的应用程序时才使i == j.

也就是说,任何符合标准的迭代器类型都必须提供operator ==.

但是,我发现没有任何关于operator !=迭代器类型的要求.

是否operator !=必须为给定的迭代器类型提供C++标准要求?

c++ standards iterator type-traits semantics

0
推荐指数
1
解决办法
63
查看次数

迭代向量和其他stl容器的样式之间的差异

假设有一个stl容器,为了简单起见,我将使用一个声明为的向量

在得到答案后,我意识到这是因为我实际上并没有迭代,int而是一个自定义数据结构模板T,只是进行编辑,以便将来有人可能会发现它更容易理解.

std::vector <T> vec;

现在有两种常用的方法来迭代它.

1.

for(std::vector<T>::iterator it = vec.begin(); it != vec.end(); ++it)
{
    /* std::cout << *it; ... */
}
Run Code Online (Sandbox Code Playgroud)

2.

for(T t: vec)
{
    /* std::cout << t; ... */
}
Run Code Online (Sandbox Code Playgroud)

现在我总是假设这两种方法在引擎盖下或多或少相同并且应该具有相似的运行时间,但是最近在hackerearth的竞争中,第二个(我通常的Goto)在最后一个测试用例上给出了TLE并且只是通过切换第一种方法我设法让所有的情况都通过,我错过了区分它们的东西,或者只是巧合(因为它们的运行时间之间的实际差异很小,只是在极限的不同侧).我找不到任何东西,所以如果您有任何链接或见解请分享.

c++ iterator stl

0
推荐指数
1
解决办法
64
查看次数

以Python方式仅获取迭代器的最后一个元素

如何获得迭代器的最后一个元素?我知道我必须用尽迭代器并返回它产生的最后一个值,所以简单的方法是:

def last(it):
    for value in it:
        pass
    return value
Run Code Online (Sandbox Code Playgroud)

(您可能想抓住NameError并提出其他内容以进行空输入,但您明白了。)

有没有我没有想到的更简单的解决方案,例如,使用itertools.islice()(虽然它似乎不接受负索引)或类似的方法?

python iterator

0
推荐指数
1
解决办法
47
查看次数

C ++ std :: vector条目的功能为NULL,但大小保持在零以上

我用C / C ++编写代码已经有一段时间了,我已经找到解决问题的替代方法,但是我想知道为什么原始代码不起作用。

我有一个测试类,基本上只存储一个字符串。

class test {
private:
        std::string name;
public:
        test(std::string name) : name(name) {};
        std::string get_name() { return name; }
};
Run Code Online (Sandbox Code Playgroud)

在其中,main我有一个向量,我有时会用test对象填充。下面的代码模拟了vector的不规则用法vect

int main(void) {
        std::vector<test *> vect;
        std::vector<test *>::iterator i;

        //* Comment this for a working example
        std::cout << "Searching empty vector" << std::endl;
        i = *(_is_in_vector(vect, std::string("test 3")));
        if (i == vect.end()) {
                std::cout << "Nothing found" << std::endl;
        } // */

        vect.push_back(new test("test 1"));
        vect.push_back(new test("test 2"));
        vect.push_back(new …
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector segmentation-fault

0
推荐指数
1
解决办法
74
查看次数

如何使用迭代器?

我正在尝试使用迭代器更改字符串中的字符。它会更改空格前的字符,但会删除该空格后的字符。

发生了什么事?

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    cout<<"Enter a string : ";
    cin>>s;

    for (auto it = s.begin(); it != s.end() && !isspace(*it);++it)
      *it = toupper(*it);

    cout<<s; // capitalize the current character
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

输入字符串:abc abc
ABC

c++ string iterator for-loop if-statement

0
推荐指数
1
解决办法
65
查看次数