像这样的东西:

struct mystruct
{
  char straddr[size];
  int port;
  int id;
  .......
};

mystruct s1={......};
mystruct s2={......};
mystruct s3={......};

vector test;
test.emplace_back(s1);
test.emplace_back(s2);
test.emplace_back(s3);


现在我想用straddr =“ abc”和port = 1001擦除元素。
我该怎么办?
而且我不想这样。

    for(auto it = test.begin();it != test.end();)
   {
      if(it->port == port && 0 == strcmp(it->straddr,straddr))
         it = test.erase(it);
     else
        it++;
   }

最佳答案

首先,使用std::string代替char [size],以便可以使用==代替strcmp和其他类似的c字符串函数。

然后将std::remove_if()erase()一起用作:

test.erase (
    std::remove_if(
        test.begin(),
        test.end(),
        [](mystruct const & s) {
            return s.port == 1001 && s.straddr == "abc";
        }
    ),
    test.end()
);


这是解决您的问题的惯用方法,您可以在这里阅读有关它的更多信息:


C++ Idioms/Erase-Remove


请注意,此解决方案将从谓词返回true的容器中删除所有元素。但是,如果预先知道最多有一个与谓词匹配的项,那么std::find_iferase()一起会更快:

auto it = std::find_if(
             test.begin(),
             test.end(),
             [](mystruct const & s) {
               return s.port == 1001 && s.straddr == "abc";
             }
          );
if(it != test.end())//make sure you dont pass end() iterator.
    test.erase(it);


希望能有所帮助。

关于c++ - 从 vector 中删除元素,并且 vector 用struct填充,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35715987/

10-12 20:52