簡體   English   中英

刪除結構c ++向量中的重復項

[英]Remove duplicates in vector of structure c++

我有以下結構。 我想將結構存儲在矢量中。 其次,我想刪除( context )上的重復值。 我究竟做錯了什么?


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//Structure
struct contextElement
{
  string context;
  float x;
};

int main()
{
  vector<contextElement> v1;
  v1.push_back({"1",1.0});
  v1.push_back({"2",2.0});
  v1.push_back({"1",1.0});
  v1.push_back({"1",1.0});
  //ERROR here
  auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
  //Remove elements that have the same context
  v1.erase(std::unique(v1.begin(), v1.end(),comp));
  for(size_t i = 0; i < v1.size();i++)
  {
    cout << v1[i].context <<"  ";
  }
  cout << endl;
  return 0;
}

錯誤:

main.cpp | 23 |錯誤:沒有匹配函數來調用'std :: vector :: erase(__ gnu_cxx :: __ normal_iterator>,std :: vector :: iterator,main():: __ lambda0&)'|


解決方案

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//Structure
struct contextElement
{
  string context;
  float x;
};

int main()
{
  vector<contextElement> v1;
  v1.push_back({"1",1.0});
  v1.push_back({"2",2.0});
  v1.push_back({"1",1.0});
  v1.push_back({"1",1.0});
  //sort elements@HaniGoc: unique only removes consecutive duplicates. If you want to move all //duplicates, then either sort it first, or do something more complicated. –  Mike Seymour
  auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context < rhs.context;};
  sort(v1.begin(), v1.end(),comp);

  auto comp1 = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
  auto last = std::unique(v1.begin(), v1.end(),comp1);
  v1.erase(last, v1.end());

  for(size_t i = 0; i < v1.size();i++)
  {
    cout << v1[i].context <<"  ";
  }
  return 0;
}

vector::erase()不接受謂詞。 你對std::unique謂詞應該檢查是否相等。

auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
auto pred = []( const contextElement& lhs, const contextElement& rhs ) {return lhs.context < rhs.context;}
std::sort(v.begin(),v.end(),pred);
auto last = std::unique(v.begin(), v.end(),comp);
v.erase(last, v.end());

不要將comp傳遞給erase ; 它只需要一個迭代器范圍。

v1.erase(std::unique(v1.begin(), v1.end(), comp), v1.end());

請注意,這只會刪除連續的重復項。 如果要刪除所有重復項,並且不介意更改順序,請先排序:

std::sort(v1.begin(), v1.end(),
    [] ( const contextElement& lhs, const contextElement& rhs ) {
        return lhs.context < rhs.context;
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM