【发布时间】:2015-10-22 14:35:01
【问题描述】:
我有两个向量。第一个是某个类的对象的向量。第二个是一个向量,其元素指向第一个向量的对象。
我有两个问题要问你。第一个是:有没有更好或更优雅的方式来声明和初始化指针向量?
第二个解释起来有点复杂。假设我想按降序查看第一个向量的元素。我所要做的就是重载运算符< 并对它们进行排序。好吧,假设现在我想以降序查看第一个向量的元素,而不改变其元素的顺序,但只能在第二个向量的帮助下。换句话说,我想对第二个向量的元素进行排序,查看它们指向的内容,而不是像往常一样查看其元素,因为它们是地址。我应该怎么办?用其他类型的参数重载运算符<?将另一个订单函数传递给sort?
我给你一个Minimal, Complete, and Verifiable example 用g++ -std=c++11 -o example example.cpp 编译。
example.ccp
#include <iostream>
#include <algorithm>
#include <vector>
class MyClass{
public:
int a;
int b;
MyClass(int a, int b) : a(a), b(b){};
bool operator<(const MyClass &obj)const{return (this->a + this->b) < (obj.a + obj.b);};
};
int main(int argc, char* argv[]){
std::vector<MyClass> vector1;
vector1.push_back({4, 5});
vector1.push_back({5, 6});
vector1.push_back({6, 7});
vector1.push_back({1, 2});
vector1.push_back({2, 3});
vector1.push_back({3, 4});
std::vector<MyClass*> vector2;
std::vector<MyClass>::iterator i;
for(i = vector1.begin(); i != vector1.end(); i++)
vector2.push_back(&(*i));
std::cout << "element pointed to by vector2 unsorted: " << std::endl;
for(int j = 0; j < vector2.size(); j++)
std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;
/* Insert here how I should sort vector2 */
// std::sort (vector2.begin(), vector2.end()); <-- Obviously this doesn't work
std::cout << "element pointed to by vector2 sorted: " << std::endl;
for(int j = 0; j < vector2.size(); j++)
std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;
return 0;
}
【问题讨论】:
-
我认为您不想这样做。任何导致
vector1重新分配的东西都会破坏vector2 -
第二个向量可以是索引的向量而不是指针。
-
我需要这样做,因为在我的项目中,vector1 中有大量元素,而且它们的类型也相对较大。我认为如果 vector1 充满了 const 值,你说的问题就解决了。
-
@JoachimPileborg:更好地解释你的意思。
-
就像@NathanOliver 所说,如果第一个向量需要重新分配其数据(如果添加元素可能会发生这种情况),那么指针将变得无效,所有迭代器也一样。但是只有当你从向量中删除一个元素时,第一个向量的索引才会变得无效。
标签: c++ sorting pointers vector