如何更改stl列表中项的值?

时间:2016-05-25 12:52:40

标签: c++ stl

我有一个关于更改或替换列表中元素的问题。我有一节课:

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();

什么都不输出。

2 个答案:

答案 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;
    }