所以我将对象放在向量中。我想在添加它们时按顺序删除它们。对象的基础是
class myObj {
private:
string firstName;
string lastName;
public:
string getFirst;
string getLast;
}
我也有这些对象的载体
vector< myObj > myVect;
vector< myObj >::iterator myVectit = myVect.begin();
当我向矢量添加一个新对象时,我希望在插入之前找到它应该放置的位置。我可以通过对象值搜索向量吗?如何?这是我的第一次尝试
void addanObj (myObj & objtoAdd){
int lowwerB = lower_bound(
myVect.begin().getLast(), myVect.end().getLast(), objtoAdd.getLast()
);
int upperB = upper_bound(
myVect.begin().getLast(), myVect.end().getLast(), objtoAdd.getLast()
);
从那里我计划使用lowwerB和上部B来确定插入条目的位置。我需要做些什么来实现这个目标?或者什么是应对这一挑战的更好方法?
----跟进----
我尝试编译时得到的错误
error C2440: 'initializing' : cannot convert from 'std::string' to 'int'
No user-defined-conversion operator available that can perform this conversion,
or the operator cannot be called
编译器突出显示lower_bound和upper_bound。我猜它是指我要放的地方
objtoAdd.getLast()
-----更多跟进----------------- 这很接近编译但不完全。我应该从lower_bound和upper_bound获得什么?它与我定义的迭代器不匹配,我不确定我应该期待什么。
void addMyObj(myObj myObjtoadd)
vector< myObj>::iterator tempLB;
vector< myObj>::iterator tempUB;
myVectit= theDex.begin();
tempLB = lower_bound(
myVect.begin()->getLast(), myVect.end()->getLast(), myObjtoadd.getLast()
);
tempUB = upper_bound(
myVect.begin()->getLast(), myVect.end()->getLast(), myObjtoadd.getLast()
);
答案 0 :(得分:0)
您对std::lower_bound
和std::upper_bound
的来电不正确。前两个参数必须是迭代器,它们定义要搜索的元素范围,返回的值也是迭代器。
由于这些算法将容器元素与第三个参数值进行比较,因此您还需要提供正确的operator<
函数来比较对象的lastName
和std::string
}。我添加了两个不同的比较函数,因为std::lower_bound
和std::upper_bound
以相反的顺序传递参数。
我认为我的代码中的机器是正确的,它应该足够接近你的想法。
class myObj {
private:
std::string firstName;
std::string lastName;
public:
std::string getFirst() const { return firstName; }
std::string getLast() const { return lastName; }
};
bool operator<(const myObj &obj, const std::string &value) // used by lower_bound()
{
return obj.getLast() < value;
}
bool operator<(const std::string &value, const myObj &obj) // used by upper_bound()
{
return value < obj.getLast();
}
int main()
{
std::vector<myObj> myVect;
std::vector<myObj>::iterator tempLB, tempUB;
myObj objtoAdd;
tempLB = std::lower_bound(myVect.begin(), myVect.end(), objtoAdd.getLast());
tempUB = std::upper_bound(myVect.begin(), myVect.end(), objtoAdd.getLast());
}
答案 1 :(得分:0)
所以这绝对不是最好的方式。这就是原因:
矢量大小
默认向量以0个元素开头,但是容纳一些数字;在添加第101个元素之后,它必须完全重新创建向量,复制所有数据,然后删除旧内存。如果做得足够,这种复制可能会变得昂贵。
插入向量
这将是一个更加严重的问题。因为向量只是一个连续的内存块,对象以插入顺序存储,所以请注意以下内容:
[xxxxxxxzzzzzzzz ]
如果您要添加&#39; y&#39;,它属于x和z,对吧?这意味着您需要将所有z移动到1个位置。但是因为你正在重复使用相同的内存块,所以你需要一次一个。
[xxxxxxxzzzzzzz z ]
[xxxxxxxzzzzzz zz ]
[xxxxxxxzzzzz zzz ]
...
[xxxxxxx zzzzzzzz ]
[xxxxxxxyzzzzzzzz ]
(这些空格是为了清晰起见 - 以前的值未明确清除)
正如您所看到的,这是为您的“&#39;”腾出空间的很多步骤,对于大型数据集来说速度非常慢。
更好的解决方案
正如其他人所说,std::set
听起来更适合您的需求。 std::set
将自动对所有插入的元素进行排序(使用树数据结构以便更快地插入),并允许您在log(n)
时间内按姓氏查找特定数据成员。它通过使用bool myObj::operator(const & _myObj) const
来了解如何对不同对象进行排序来实现此目的。如果您只是定义此运算符来比较this->lastName < _myObj.lastName
,则可以更快地插入到集合中。
或者,如果你真的想要使用vector:而不是在你去的时候对它进行排序,只需将所有项添加到向量中,然后执行std::sort
以在完成所有插入后对它们进行排序。这也将在n log(n)
时间内完成,但由于矢量插入问题,应该比当前方法快得多。