创建一组向量 我试图在C++中创建一组向量。我希望向量[1,2]和[2,1]在集合中被认为是相等的。因此,这两种情况都不应该存在于集合中。此外,向量可以多次具有相同的元素,因此[1,2]和[1,2,2]不应相等

创建一组向量 我试图在C++中创建一组向量。我希望向量[1,2]和[2,1]在集合中被认为是相等的。因此,这两种情况都不应该存在于集合中。此外,向量可以多次具有相同的元素,因此[1,2]和[1,2,2]不应相等,c++,vector,set,C++,Vector,Set,我尝试了以下代码: int main() { vector<int> vt1{1,2}; vector<int> vt2{2,1}; set<vector<int>> st; st.insert(vt1); st.insert(vt2); } intmain(){ 向量vt1{1,2}; 向量vt2{2,1}; 设置st; 圣安德鲁斯酒店(vt1); 圣艾斯特酒店(vt2); } 但是在运行这个代码之后,

我尝试了以下代码:

int main() {
    vector<int> vt1{1,2};
    vector<int> vt2{2,1};
    set<vector<int>> st;
    st.insert(vt1);
    st.insert(vt2);
}
intmain(){
向量vt1{1,2};
向量vt2{2,1};
设置st;
圣安德鲁斯酒店(vt1);
圣艾斯特酒店(vt2);
}

但是在运行这个代码之后,我发现集合中同时包含
[1,2]
[2,1]
,这是因为向量
[1,2]
[2,1]
是不同的。也许一组向量不是你想要的。可以尝试不同的数据结构,例如一组集合:

#include <set>

int main() {
    std::set<int> vt1{ 1,2 };
    std::set<int> vt2{ 2,1 };
    std::set<std::set<int>> st;
    st.insert(vt1);
    st.insert(vt2);
    std::cout << st.size() << std::endl;
}
#包括
int main(){
std::set vt1{1,2};
std::set vt2{2,1};
std::set st;
圣安德鲁斯酒店(vt1);
圣艾斯特酒店(vt2);

std::cout如果您不能使用内部
std::multi_set
并且确实需要
std::vector
(并保持
std::vector
的原始顺序),您可以提供自定义比较器:

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

struct compare_as_set
{
    template <typename T>
    bool operator()(std::vector<T> rhs, std::vector<T> lhs) const
    {
        std::sort(rhs.begin(), rhs.end());
        std::sort(lhs.begin(), lhs.end());

        return rhs < lhs;
    }
};

int main() {
    std::vector<int> vt1{ 1,2 };
    std::vector<int> vt2{ 2,1 };
    std::set<std::vector<int>, compare_as_set> st;
    st.insert(vt1);
    st.insert(vt2); // insertion would fail as vt2 is equivalent to vt1
    std::cout << st.size() << std::endl; // So output is 1
}

#include

向量是按元素进行比较的,因此它不是sameI所想的集合集。但是内部数据结构可以有重复的元素。然后
集合的
集合的
多个集合的
std::set
每次调用比较器时都复制向量。对于大的向量,这可能非常低效,在这种情况下,我t最好使用一些其他方法,例如在插入集合之前将向量转换为集合/多集合。@sklott:的确,如果OP可以使用
std::multi_set
而不是
std::vector
,这是一种方法。但是如果OP想保持
std::vector
(原始顺序),复制(但更糟糕的是
排序
)在某些地方似乎需要。使用类似于
std::set
的东西在类中包装是另一种避免复制(与内存交换)的选择。
#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

struct compare_as_set
{
    template <typename T>
    bool operator()(std::vector<T> rhs, std::vector<T> lhs) const
    {
        std::sort(rhs.begin(), rhs.end());
        std::sort(lhs.begin(), lhs.end());

        return rhs < lhs;
    }
};

int main() {
    std::vector<int> vt1{ 1,2 };
    std::vector<int> vt2{ 2,1 };
    std::set<std::vector<int>, compare_as_set> st;
    st.insert(vt1);
    st.insert(vt2); // insertion would fail as vt2 is equivalent to vt1
    std::cout << st.size() << std::endl; // So output is 1
}