1

我有四个可能(或可能不)包含元素的 std::vector 容器。我想确定其中哪些元素最多并随后使用它。

我试图创建一个 std::map ,它们各自的大小作为键,对这些容器的引用作为值。然后我在每个向量的 size() 上应用 std::max 以找出最大值并通过 std::map 访问它。

显然,一旦至少两个向量中有相同数量的元素,这就会给我带来麻烦。

谁能想到一个优雅的解决方案?

4

6 回答 6

13

你在这方面想得太多了。你只有四个向量。您可以使用 3 次比较来确定最大向量。只需这样做:

std::vector<blah>& max = vector1;
if (max.size() < vector2.size()) max = vector2;
if (max.size() < vector3.size()) max = vector3;
if (max.size() < vector4.size()) max = vector4;

编辑:

现在有指针!

编辑(280Z28):

现在有参考!:)

编辑:

带有引用的版本将不起作用。Pavel Minaev 在评论中很好地解释了它:

没错,代码使用引用。声明 max 的第一行不会导致复制。但是,以下所有行都会导致复制,因为当您编写 时max = vectorN,如果 max 是引用,则不会导致引用引用不同的向量(一旦初始化,引用就不能更改为引用不同的对象)。相反,它与 相同 max.operator=(vectorN),只是导致vector1被清除并替换为 中包含的元素 vectorN,复制它们。

指针版本可能是您最好的选择:它快速、低成本且简单。

std::vector<blah> * max = &vector1;
if (max->size() < vector2.size()) max = &vector2;
if (max->size() < vector3.size()) max = &vector3;
if (max->size() < vector4.size()) max = &vector4;
于 2009-11-04T16:37:55.447 回答
9

这是一个解决方案(除了 Pesto 过于简单的方法)——bind出于解释的目的,我已经避免使用 C++0x lambda,但您可以使用它们来消除对单独函数的需要。我还假设对于两个具有相同数量元素的向量,选择哪个是无关紧要的。

template <typename T> bool size_less (const T* lhs, const T* rhs) {
    return lhs->size() < rhs ->size();
}

void foo () {
    vector<T>* vecs[] = {&vec1, &vec2, &vec3, &vec4};
    vector<T>& vec = std::min_element(vecs, vecs + 4, size_less<vector<T> >);
}
于 2009-11-04T16:41:31.417 回答
1

这是我非常简单的方法。唯一感兴趣的是您只需要基本的 c++ 即可理解它。

 vector<T>* v[] = {&v1, &v2, &v3, &v4}, *max=&v1;
 for(int i=1; i < 4; ++i)
     if (v[i]->size() > max->size()) max = v[i];
于 2009-11-05T02:16:29.790 回答
0

这是 coppro 答案的修改版本,使用 std::vector 引用任意数量的向量进行比较。

template <typename T> bool size_less (const T* lhs, const T* rhs) {
    return lhs->size() < rhs ->size();
}

void foo () {
    // Define vector holding pointers to the original vectors
    typedef vector< vector<T>* > VectorPointers;

    // Fill the list
    VectorPointers vecs;
    vecs.push_back(&vec1);
    vecs.push_back(&vec2);
    vecs.push_back(&vec3);
    vecs.push_back(&vec4);        

    vector<T>& vec = std::min_element(
        vecs.begin(), 
        vecs.end(), 
        size_less<vector<T> >
    );
}
于 2009-11-04T16:54:15.487 回答
0

我完全支持过度思考的东西:)
对于在组中找到最高/最低元素的一般问题,我会使用带有比较器的 priority_queue:(
从 coppro 无耻地复制,并修改......)

template <typename T> bool size_less (const T* lhs, const T* rhs)
{
  return lhs->size() < rhs ->size();
}


vector* highest()
{
  priority_queue<vector<T>, size_less<T> > myQueue;
  ...
  ...
  return myQueue.top();
}  
于 2009-11-04T17:45:52.720 回答
-1

您可以使用 std::multimap。这允许具有相同键的多个条目。

于 2009-11-04T16:39:46.547 回答