【问题标题】:What is the uses of using a pointer in this specific scenario?在这种特定情况下使用指针有什么用?
【发布时间】:2014-03-12 10:02:22
【问题描述】:

在这种情况下,我声明了一个结构数据。

struct Data {
       string first;
       string middle;
       string last;
       int age;
       };

根据我的笔记,我们接着创建一个

vector<Data*> list;

要将项目添加到此列表中,我们必须创建一个新的数据指针并手动设置属性。

Data* variable;
variable=new Data;
list.pushback<variable>

我没有看到使用这种方法的优点。为什么我们不能只使用它?

vector<Data> list;

要将项目添加到此列表中,我创建了一个新的 Data 变量,然后使用 list.pushback&lt;variable&gt;;

我说这两种方法都有效吗?

【问题讨论】:

标签: c++


【解决方案1】:

首先必须是

 list.push_back(variable)

而不是

list.pushback<variable>

不同的是,在情况1中,您创建了一个指向变量的指针,这意味着您只将变量的地址存储在列表中。这段代码

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

using namespace std;
struct Data {
    string first;
    string middle;
    string last;
    int age;
};

int main()
{
vector<Data*> list;


Data* variable;
variable = new Data;
list.push_back(variable);

cout << list[0];
cin.get();

return 0;
}

只会返回内存中存储变量的位置的地址。 因此,要返回一些变量值,您可以使用类似

vector<Data*> list;
Data* variable;
variable = new Data;
variable->setage(5);
list.push_back(variable);

cout <<  (*list[0]).getage();
cin.get();
return 0;
}

其中 *list[0] 取消引用指针,这意味着您获得的是值而不是它的地址。

如果你在没有指针的情况下工作

vector<Data> list;


Data variable;
list.push_back(variable);

相反,您可以在列表中存储变量的副本。

所以在这种情况下,您可以通过类似的方式直接寻址变量

list[0].getage()

如果您在 struct Data 中创建 getage() 函数。

如果你不知道怎么做,一个简单(也许不是最好的)方法是添加

public:
    int getage(){
        return age;
    }
    void setage(int x){
        age = x;
    }
};

在你的结构数据中。

【讨论】:

    【解决方案2】:

    速度更快。 对于你的情况,如果你这样做

    Data variable;
    // change properties here
    list.push_back(variable);
    

    您将首先在第一行创建一个结构Data,然后在将其推回列表时复制整个结构。由于 struct 比指向它的指针大,因此这样做的计算效率根本不及仅推送 struct 指针。

    【讨论】:

    • 不会比list.push_back(Data());快多少
    • 我想说你还需要复制 Data()?虽然那时它只是 3 个空字符串和一个 int,但它会非常快。
    • 它会被移动分配,std::string 移动很便宜。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多