C++ vector<vector<int>>'仅选择只出现一次的条目

C++ vector<vector<int>>`select only entries that appear just once

本文关键字:lt gt vector 一次 int 选择 C++      更新时间:2023-10-16

我有vector<vector<int>>,它有以下条目:

2 3
3 4
2 3
4 5
5 6

我需要用只出现一次的条目创建另一个vector<vector<int>>。因此:

3 4
4 5
5 6

我包含了两个代码示例。函数"add_pair"在尚未添加整数对的情况下添加该对。函数"make_pairs_with_two_vectors"为您提供未排序和排序的向量。函数"make_pairs_with_one_vector"只提供排序后的向量。

void add_pair(std::vector<std::pair<int, int>>& _MyPairs, std::pair<int, int> _Pair) {
    for (unsigned int i = 0; i < _MyPairs.size(); i++) {
        if (_MyPairs[i].first == _Pair.first && _MyPairs[i].second == _Pair.second) {
            return;
        }
    }
    _MyPairs.push_back(_Pair);
}
void make_pairs_with_two_vectors() {
    std::vector<std::pair<int, int>> my_pairs;
    my_pairs.push_back(std::pair<int, int>(2, 3));
    my_pairs.push_back(std::pair<int, int>(3, 4));
    my_pairs.push_back(std::pair<int, int>(2, 3));
    my_pairs.push_back(std::pair<int, int>(4, 5));
    my_pairs.push_back(std::pair<int, int>(5, 6));
    std::vector<std::pair<int, int>> my_pairs_once;
    for (unsigned int i = 0; i < my_pairs.size(); i++) {
        add_pair(my_pairs_once, my_pairs[i]);
    }
}
void make_pairs_with_one_vector() {
    std::vector<std::pair<int, int>> my_pairs;
    add_pair(my_pairs, std::pair<int, int>(2, 3));
    add_pair(my_pairs, std::pair<int, int>(3, 4));
    add_pair(my_pairs, std::pair<int, int>(2, 3));
    add_pair(my_pairs, std::pair<int, int>(4, 5));
    add_pair(my_pairs, std::pair<int, int>(5, 6));
}

这将给出您要查找的结果使用std::mapstd::pair

#include <iostream>
#include <vector>
#include <map>
int main() {
    std::map<std::pair<int, int>, int> count_map;
    std::vector<std::pair<int, int> > v;
    std::vector<std::pair<int, int> > v2;
    int a[10] = {2,3,3,4,2,3,4,5,5,6};
    for(int i = 0; i < 10; i++) {
        int first = a[i];
        int second = a[++i];
        std::pair<int, int> p = std::make_pair(first, second);
        v.push_back(p);
        count_map[p]++;
    }
    for(auto it = count_map.begin(); it != count_map.end(); ++it) {
        if(it->second != 1) continue;
        v2.push_back(it->first);
        std::cout << it->first.first << ", " << it->first.second << std::endl;
    }
}

如果使用std::pair分配数据,则可以使用std::sortstd::unique:

std::vector<std::pair<int,int>> vPairs;
std::sort(vPairs.begin(), vPairs.end());
std::vector<std::pair<int,int>>::iterator it;
it = std::unique(vPairs.begin(), vPairs.end()); // iterator keeps the last unique element position
vPairs.resize( std::distance(vPairs.begin(),it) ); // resize according to unique pair number