【问题标题】:How to have a vector of byvalue and use a vector of pointers in conjunction?如何拥有一个按值向量并结合使用一个指针向量?
【发布时间】:2010-12-09 05:02:05
【问题描述】:

我有一些 A 类对象的向量:

 std::vector<A> *V1;
 std::vector<A> *V2;

有一个函数的指针向量为 A:

 std::vector<A *> *arranged;

我需要做的是把来自 V1、V2 等的向量放在里面排列而不最终破坏它们,所以我认为指向这些对象的指针向量......这可能吗? 如果是的话,你能给我一个带有变量 V1 的迭代示例并将这些对象的指针添加到排列中吗?

假设您暂时需要将 3 个对象向量分类为一个向量,但您不想弄乱这 3 个向量的内存。

ty,

【问题讨论】:

    标签: c++ memory pointers vector stack


    【解决方案1】:

    如果我对您的理解正确 - 您有多个包含某种对象类型 (A) 的向量,并且您想要创建一个新向量,其中包含其他向量的所有成员的组合,而无需实际复制周围的对象,或者否则会以任何方式干扰他们的拥有向量?

    首先:新复合向量的生命是否确实存在,以至于它的源向量都不会改变?也就是说:如果这些指针将在您的复合材料的生命周期内失效,那么您不能只从复合向量中将原始指针指向源向量。

    如果答案不是“绝对,指针将保持有效”,那么您需要考虑使用共享指针或类似的东西,这样更改源向量不会使您的复合向量处于无效状态(即不要让它指向随机内存)。

    假设源向量在复合材料的生命周期内其自身内容保持不变,那么简单的答案是“是”

    vector<A> source1;
    vector<A> source2;
    vector<A> source3;
    
    vector<const A*> composite; // this is a sorted vector of the above vectors' contents (by pointer)
    

    对于复合向量,您需要将 source1-3 的内容(通过副本)放入其中,然后对其进行排序(或者您可以使用排序容器,并在插入元素时进行排序)。您需要定义自己的排序运算符,它取消引用指针并将任何排序算法应用于目标对象本身。

    这对你有帮助吗?

    【讨论】:

    • 它有帮助,但是向量不会在作用域的末尾保持活动状态,正如我所描述的那样,它是一个指针,只是因为它将被其他一些函数使用并且在末尾main函数,我删了
    • 真正了解指针的全部含义、对象的生命周期等,对于成功的 C++ 编程至关重要。拥有一个指针容器需要它们指向的东西在它们指向的整个时间内保持有效!所以 source1-3 不能被销毁(超出范围),它们的内容也不能改变(你不能插入东西,或者重新排序),否则复合中的指针将指向随机信息(而不是你想要的对象他们到)。如果你还没有读过的话,我强烈推荐 Scott Myers Effective C++ 系列。 ;)
    【解决方案2】:

    您可以编写自己的比较器。在这种情况下,比较器将在A* 上工作。一个使用int的简单例子:

    void fun(vector<int*>* vec)
    {
      /////////
    }
    
    bool comp(int* lhs, int* rhs)
    {
        return *lhs < *rhs;
    }
    
    int main()
    {
        vector<int> first, second;
        vector<int*> vec;
    
        for(vector<int>::size_type i = 0; i < first.size(); ++i)
            vec.push_back(&first[i]);
        for(vector<int>::size_type i = 0; i < second.size(); ++i)
            vec.push_back(&second[i]);
    
        // write your own comparator! provided above: comp
        sort(vec.begin(), vec.end(), comp);
    
        fun(&vec);
    
        return 0;
    }
    

    【讨论】:

    • 嗨,感谢您的回复,所以当我将指针添加到向量中的项目时,它不会复制,而只是指向?我理解的问题是向量有堆栈而不是堆,那么外部函数如何指向它?还是我只是搞砸了概念?当你 push_back 里面的东西时 vector 它会再次创建它但在堆上吗?
    • vec' when are pushing the addresses of the variables in first` 和 second 中推送内容时。对vec', the values will be compared but the pointers them selves will be swapped in vec'进行排序时。
    • 谢谢,我还有一些关于 hean 和 stack 的问题,但会在 google 上学习。标记你的答案并给你一分,谢谢!
    • std::vector 在堆中创建一个动态数组。当您向其中推送某些内容时,它会复制该对象,并将其添加到其内部数组中。它自己的向量对象将在堆栈​​上,这意味着大小、容量和指向内部数组的指针。它自己的内部数组将在堆中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2014-04-02
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多