首页 > 解决方案 > 如何使用字符串匹配从向量中删除整个元组?

问题描述

我正在尝试从与输入字符串匹配的向量中删除一个元组。

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_))
                  ~~~~ ^  ~~~~~~~~

标签: c++vectortuples

解决方案


这是一个示例,它演示了一种相当有效的方法,可以从匹配条件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::tuplestd::tuplestd::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


推荐阅读