向量中的字符串。并将它们整理好

时间:2014-11-05 03:05:45

标签: c++ string object vector

所以我将对象放在向量中。我想在添加它们时按顺序删除它们。对象的基础是

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()
             );

2 个答案:

答案 0 :(得分:0)

您对std::lower_boundstd::upper_bound的来电不正确。前两个参数必须是迭代器,它们定义要搜索的元素范围,返回的值也是迭代器

由于这些算法将容器元素与第三个参数值进行比较,因此您还需要提供正确的operator<函数来比较对象的lastNamestd::string }。我添加了两个不同的比较函数,因为std::lower_boundstd::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)时间内完成,但由于矢量插入问题,应该比当前方法快得多。