搜索并替换结构向量中的值

时间:2020-06-04 00:18:00

标签: c++ vector struct lambda

我正在尝试将字符串与结构向量中的struct元素进行比较,如果值匹配,请用新值替换struct元素中的值。我可以很好地填充矢量,但是在搜索和替换上无法正常工作。

struct info {
    string name;
    string phone;
    string address;
}
vector<info> data;

首先,我只是尝试遍历向量中的每个元素,然后将当前值与字符串进行比较。如果它们匹配,我将当前值替换为新值。尽管新的价值将恢复为旧的价值,但这似乎可行。我以为我要更改副本,但我不明白为什么。这是代码。

for (auto e : data)
{
    if (e.name == old_name)  { e.name = new_name; }
}

我最近的尝试是使用std::replace_if和lambda表达式进行搜索和替换。

std::replace_if(data.begin(), data.end(), [old_name](info i){ return i.name == old_name; }, new_name);

但是,代码无法编译,并出现以下错误-C2679二进制'=':未找到采用'const _Ty'类型的右侧操作数的运算符(或没有可接受的转换)

有人可以帮助我了解发生了什么事吗?

1 个答案:

答案 0 :(得分:3)

要更改向量中的元素,您需要在range-for循环中使用参考:

for (auto &e : data)

否则,您将制作一个副本,但不会更改原始元素。

replace_if的第4个参数需要一个info对象,而不仅仅是new_name值。

此处使用的适当算法将是replace_if,而不是for_each,它会根据需要修改info对象:

std::for_each(data.begin(), data.end(), 
               [old_name, new_name](info &i) { 
                 if (i.name == old_name)
                    i.name = new_name;
              });

但是,在这种情况下,range-for循环的代码可能更少,并且更容易读写。

此外,请避免使用using namespace std;,这是不正确的做法。