指向向量中元素的指针 我对C++有了新的见解,已经阅读了一些关于把指针存储到对象或向量中的对象本身的主题。 我决定将对象存储在向量中,因为在运行时我不会推回许多对象,向量只创建一次,并像这样离开

指向向量中元素的指针 我对C++有了新的见解,已经阅读了一些关于把指针存储到对象或向量中的对象本身的主题。 我决定将对象存储在向量中,因为在运行时我不会推回许多对象,向量只创建一次,并像这样离开,c++,qt,C++,Qt,我现在的问题是,我有另一个对象,它获取一个向量作为参数,并在传递的向量中搜索某个对象。如果找到该对象,则存储指向该对象的指针;如果未找到,则将变量设置为NULL 即使我没有推回任何项目,指针似乎指向其他函数中的错误位置。 在向量中搜索元素的对象有一个公共函数,在该函数中应该返回指针。如果我在每次函数调用时搜索对象,速度会非常慢,因此这不应该是一个选项。 还有其他解决方案吗,或者我必须切换到指针向量吗? 一些代码片段: 搜索向量的对象的构造函数: MySearch::MySearch(QVecto

我现在的问题是,我有另一个对象,它获取一个向量作为参数,并在传递的向量中搜索某个对象。如果找到该对象,则存储指向该对象的指针;如果未找到,则将变量设置为
NULL

即使我没有
推回
任何项目,指针似乎指向其他函数中的错误位置。 在向量中搜索元素的对象有一个公共函数,在该函数中应该返回指针。如果我在每次函数调用时搜索对象,速度会非常慢,因此这不应该是一个选项。 还有其他解决方案吗,或者我必须切换到指针向量吗?

一些代码片段:

搜索向量的对象的构造函数:

MySearch::MySearch(QVector<Obj> objVector)
    :objVector(objVector) {
    found = NULL
    foreach(Obj o, this->objVector) {
        if(..found..) {
            found = &o;

            break;
        }
    }
}
Obj* MySearch::getObject() {
    return found;
}

o
驻留在堆栈上,其生命周期仅限于循环。引用它和以后返回会导致未定义的行为。

< P>如果你使用<代码> BooStY-Frace(从Boost C++库),那么你可以使用非常量引用来引用vector中的对象。code>Q_FOREACH不支持非常量引用:

BOOST_FOREACH(Obj& o, this->objVector) {
    if(..found..) {
        found = &o;

        break;
    }
}

或者对循环使用迭代器和

问题是因为变量
o
是局部变量,一旦循环结束就会超出范围。如果您使用矢量元素的地址而不是
o
,它将起作用

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class MySearch
{
public:
  MySearch(const vector<string> &items)
    : items_(items) 
  {
    // Skipping validation
    found_ = &(items_[5]);
  }

  string *getObject() {return found_;}

private:
  vector<string> items_;
  string *found_;
};

int main()
{
  string str = "test#";
  vector<string> aux;
  for (int i = 0; i < 10; ++i)
    aux.push_back(str + (char)('0' + i));  // test#0 ... test#9   

  MySearch ms(aux);
  cout << *(ms.getObject()) << endl; // test#5

  return 0;
}
#包括
#包括
#包括
使用名称空间std;
类MySearch
{
公众:
MySearch(常量向量和项目)
:项目(项目)
{
//跳过验证
发现&(项目[5]);
}
string*getObject(){return found}
私人:
向量项;
找到字符串*;
};
int main()
{
string str=“test#”;
矢量辅助;
对于(int i=0;i<10;++i)
辅助推回(str+(char)('0'+i));//测试#0…测试#9
我的研究ms(辅助);

你的代码似乎是在试图记住你正在寻找的东西,而不是矢量中的任何东西。你到底想做什么?这是什么语言?“博士,你是什么意思?”我想记住找到的对象的指针。<代码> Furace<代码>不是C++,这就是我问的原因。谢谢,但是如果我是U,它会被保存吗?sed指向向量中的对象的指针?我想不是,还是我错了?如果你不取o的地址,它在函数结束时消失了,它会变得不那么糟糕-没有人提到每一个的boost。它看起来仍然像伪代码。我不认为
found
在Q_FOREACH循环之外是有效的,因为Q_FOREACH迭代over是容器的副本。@doctorlove是
。found..
位显然是伪代码,但我只是在复制OP的内容。@Pete是的,确实如此。但是,由于QVector使用隐式共享,Q_FOREACH实际上会按照我最初说的方式工作,除非您修改QVector本身,因为迭代使用常量迭代器。required const cast很难看。他确实将向量保留在同一个类中-构造函数初始值设定项列表和此->objVector的使用是问题的线索,但他可能仍然应该避免名称歧义。是的,你是对的。我错过了构造函数初始值设定项。我将编辑答案。@Jose Rios,为什么它都被删除了t?你不应该这样做。请删除三振,只保留答案的最新(最正确)版本。
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class MySearch
{
public:
  MySearch(const vector<string> &items)
    : items_(items) 
  {
    // Skipping validation
    found_ = &(items_[5]);
  }

  string *getObject() {return found_;}

private:
  vector<string> items_;
  string *found_;
};

int main()
{
  string str = "test#";
  vector<string> aux;
  for (int i = 0; i < 10; ++i)
    aux.push_back(str + (char)('0' + i));  // test#0 ... test#9   

  MySearch ms(aux);
  cout << *(ms.getObject()) << endl; // test#5

  return 0;
}