c++ - 如何使用字符串匹配从向量中删除整个元组?
问题描述
我正在尝试从与输入字符串匹配的向量中删除一个元组。
vector< tuple<string, int, int> > goals;
因此,如果字符串与输入字符串 x 匹配,我希望将其删除。
void remove_goal(const string& x){
goals.erase(remove(goals.begin(), goals.end(), x));
}
但我收到了这个错误
error: invalid operands to binary expression ('std::__1::tuple<std::__1::basic_string<char>, std::__1::basic_string<char>, int>' and 'const std::__1::basic_string<char>')
if (!(*__i == __value_))
~~~~ ^ ~~~~~~~~
解决方案
这是一个示例,它演示了一种相当有效的方法,可以从匹配条件std::tuple
的 a 中删除 s 。std::vector
它使用恰当命名的擦除/删除习语。
#include <algorithm>
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
int main() {
std::vector<std::tuple<std::string, int, int>> v;
v.push_back(std::make_tuple("Hello", 1, 1));
v.push_back(std::make_tuple("Cruel", 2, 2));
v.push_back(std::make_tuple("World.\n", 3, 3));
v.erase(std::remove_if(v.begin(), v.end(),
[](auto s) { return std::get<0>(s) == "Cruel"; }),
v.end());
for (auto i : v) {
std::cout << std::get<0>(i) << ' ';
}
}
输出:
Hello World.
如您所见,您走在正确的轨道上。但是您不能仅仅因为a 包含 a就直接将 astd::string
与 a进行比较。这种逻辑没有真正意义,也没有扩展到其他示例。std::tuple
std::tuple
std::string
这解决了您在函数中发生擦除的编辑:
#include <algorithm>
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
void remove_from(std::vector<std::tuple<std::string, int, int>>& v,
const std::string& val) {
v.erase(std::remove_if(v.begin(), v.end(),
[&val](auto s) { return std::get<0>(s) == val; }),
v.end());
}
int main() {
std::vector<std::tuple<std::string, int, int>> v;
v.push_back(std::make_tuple("Hello", 1, 1));
v.push_back(std::make_tuple("Cruel", 2, 2));
v.push_back(std::make_tuple("World.\n", 3, 3));
remove_from(v, "Cruel");
for (auto i : v) {
std::cout << std::get<0>(i) << ' ';
}
}
它之所以有效,是因为我只是对所持有的值进行比较,而根本没有尝试修改val
。
推荐阅读
- server - 微软 BizTalk HIS SNA
- android - ShapeableImageView 不显示矢量图像
- flutter - (Dart) 小部件不是一种类型
- javascript - Reactjs:为什么我的 Android 虚拟设备显示“this.setState_if_Tie”不是一个函数?
- ruby-on-rails - 无法在 Rails 中销毁会话/注销
- xml - 单击按钮时,按钮的可见性应在另一个页面中折叠 - UWP
- typescript - 将值从 typescript 函数导入到 shell 脚本
- java - (Intellij) 编译时出现“未封闭字符文字”和“非法字符'\u00a7'”
- javascript - 使用javascript在pdf查看器中仅隐藏下载、打印选项
- javascript - 尝试将新成员添加到 MailChimp 列表会导致错误 400(“此值不应为空”)