我正在尝试将字符串与结构向量中的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'类型的右侧操作数的运算符(或没有可接受的转换)
有人可以帮助我了解发生了什么事吗?
答案 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;
,这是不正确的做法。