我有一个关于更改或替换列表中元素的问题。我有一节课:
class Node{
public:
elType type; // enum
string name;
Node(elType type, string name);
~Node();
void printNodeInfo();
}
和一个清单:
std::list <Node * > someList;
现在我如何在这样的元素中替换一个值(对于eaxmple更改类型)。 我试过这个:
std::list<Node * >::iterator it = someList.end();
it--;
while(openName.compare((*it)->name) != 0)
it--;
(*it)->type = otherType;
但它似乎不起作用,类型保持不变。我会感激任何帮助。
编辑: 我更新了清单,所以现在我有:
std::list <Node> someList;
并将替换更改为:
it->type = otherType;
我也尝试过:
std::list<Node >::iterator it2 = someList.erase(it);
Node temp(otherType, openName);
someList.insert(it2, temp);
之后两种情况都是一种简单的打印方法:
it2->printNodeInfo();
什么都不输出。
答案 0 :(得分:1)
我完全不知道你的问题是什么,但这是你的解决方案:
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Node{
public:
int type; // enum
string name;
Node(int type, string name) : type(type), name(name) {}
~Node(){}
void printNodeInfo() const {cout << type << ", " << name << endl;}
};
void replace(list<Node> &l, const string &nameSearch, int typeReplace) {
for (auto it = l.rbegin(); it != l.rend(); it++) {
if (it->name == nameSearch) {
it->type = typeReplace;
/* To stop searching */
return;
}
}
/* Nothing replaced, error message? */
}
int main() {
list<Node> l;
l.push_back(Node(0, "World"));
l.push_back(Node(1,"Hello"));
l.push_back(Node(2,"World"));
replace(l, "World", 42);
for (const auto &el: l) {
el.printNodeInfo();
}
return 0;
}
答案 1 :(得分:0)
我想知道您为何使用Node *
代替Node
。请考虑使用list<Node>
代替list<Node *>
,除非您能说明原因。
我现在假设list<Node>
。
要从STL中查找元素,请使用find。您可以像find(someList.begin(), someList.end(), value)
一样使用它;在您的情况下,值将为elType
类型。
您还必须提供一个比较运算符,用于将节点名称与给定名称进行比较。
没有足够的信息我做了你的简化例子。也许这会让你纠正/接近你想要达到的目标。
// Example program
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
enum elType { red, green, blue };
using namespace std;
class Node{
public:
elType type; // enum
string name;
Node(elType type, string name);
};
Node::Node(elType type, string name) {
this->type = type;
this->name = name;
};
// ensure that name can be found using find of STL
bool operator==(Node &n, string name) {
return n.name == name;
}
int main() {
// Create nodes
Node n1(elType::red, "Node 1");
Node n2(elType::green, "Node 2");
Node n3(elType::blue, "Node 3");
// Output node names and types
cout << n1.name << " : " << n1.type << endl;
cout << n2.name << " : " << n2.type << endl;
cout << n3.name << " : " << n3.type << endl;
// Create list of nodes
list<Node> someList{ n1, n2, n3 };
// find node with name "Node 3"
auto it = find(someList.begin(), someList.end(), "Node 3");
// if a node was found change its type to red
if ( it != someList.end() ) {
it->type = elType::red;
}
// output nodes in list
cout << endl;
for ( auto node: someList ) {
cout << node.name << " : " << node.type << endl;
}
return 0;
}
如其他用户所述,您也可以使用反向迭代器
在这种情况下,简单地将begin()
和end()
替换为rbegin()
和rend()
,如下所示:
// find node with type "blue" and change type to "red"
auto it = find(someList.begin(), someList.end(), "Node 3");
// if a node was found change its type
if ( it != someList.end() ) {
it->type = elType::red;
}