这是一种奇怪的行为,我不明白我有。
我有一个带有列表的类 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)
有人可以向我解释为什么会发生这种情况吗?为什么我必须通过这样的临时变量才能不中止?先感谢您 !
我对 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++ 的新手。我想知道:std::multimap(C++11)集合的迭代器中是否有一些插入时间保留?
我认为,因为它是由任意值索引的,所以不能保证迭代器中元素的排序保留插入时间,但我正在处理一些做出不同假设的代码,即返回的元素begin()是相关的到广告订单。
我正在尝试编写字符串列表.用户可以添加到列表或从列表中删除,以及显示当前列表.
显示列表和添加到列表工作正常,但我无法弄清楚如何通过遍历列表来查找匹配来删除用户的字符串.
我如何更改我的代码来解决这个问题? 看看是否(答案== 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) 我有一个名为的抽象类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++ 17标准27.2.1.8说:
迭代器j被称为可以从迭代器i到达,当且仅当存在表达式++ i的有限序列的应用程序时才使i == j.
也就是说,任何符合标准的迭代器类型都必须提供operator ==.
但是,我发现没有任何关于operator !=迭代器类型的要求.
是否operator !=必须为给定的迭代器类型提供C++标准要求?
假设有一个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并且只是通过切换第一种方法我设法让所有的情况都通过,我错过了区分它们的东西,或者只是巧合(因为它们的运行时间之间的实际差异很小,只是在极限的不同侧).我找不到任何东西,所以如果您有任何链接或见解请分享.
如何获得迭代器的最后一个元素?我知道我必须用尽迭代器并返回它产生的最后一个值,所以简单的方法是:
def last(it):
for value in it:
pass
return value
Run Code Online (Sandbox Code Playgroud)
(您可能想抓住NameError并提出其他内容以进行空输入,但您明白了。)
有没有我没有想到的更简单的解决方案,例如,使用itertools.islice()(虽然它似乎不接受负索引)或类似的方法?
我用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) 我正在尝试使用迭代器更改字符串中的字符。它会更改空格前的字符,但会删除该空格后的字符。
发生了什么事?
#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