簡體   English   中英

如何返回在函數中構造的向量指針值

[英]how to return vector pointer value that is constructed in a function

我在獲取 vector* 值的返回值時遇到問題。 我希望在 get_vectorD 退出后,返回的值 vector* 仍然有一個大小為 1000 的組件。 讓我知道下面我的代碼有什么問題。

#include <iostream>
#include <vector>
using namespace std;

void get_vectorD(vector<int>* D) 
{
    vector<int>* d_vec = new vector<int>();
    for (int i = 0; i < 1000; i++) { d_vec->push_back(i); }
    D = d_vec; 
}

void main()
{   
    vector<int>* D = new vector<int>();
    get_vectorD(D);
    cout << D->at(0) << endl;
}

問題是您正在按值傳遞指針。 通過引用傳遞它,它將起作用

void get_vectorD(vector<int>*& D)
{
    vector<int>* d_vec = new vector<int>;
    for (int i = 0; i < 1000; i++) { d_vec->push_back(i); }
    D = d_vec; 
}

您可以使用函數返回值:

vector<int>* get_vectorD()
{
    vector<int>* d_vec = new vector<int>;
    for (int i = 0; i < 1000; i++) { d_vec->push_back(i); }
    return d_vec;
}

或使用指針的指針

#include <iostream>
#include <vector>

using namespace std;

void get_vectorD(vector<int>** D)
{
    vector<int>* d_vec = new vector<int>;
    for (int i = 0; i < 1000; i++) { d_vec->push_back(i); }
    *D = d_vec;
}

int main()
{
    vector<int>* D;
    get_vectorD(&D);
    cout << D->at(0) << endl;
    delete D;
    return 0;
}

以下將起作用:

#include <iostream>
#include <vector>
using namespace std;

void get_vectorD(vector<int>*& D) 
{
    D = new vector<int>();
    for (int i = 0; i < 1000; i++) { D->push_back(i); } 
}

int main()
{   
    vector<int>* D;
    get_vectorD(D);
    cout << D->at(0) << endl;
}

演示

由於您按值傳遞std::vector的指針,因此您在get_vectorD函數中執行的任何操作都不會對vector<int>* D產生任何影響。 這就是為什么您需要傳遞對指針的引用。

此外,您的get_vectorD函數中不需要臨時d_vec變量。

更好的方法

此外,它會具有相同的效果,並且根本不使用指針會更不容易出錯,例如:

#include <iostream>
#include <vector>

void get_vectorD(std::vector<int>& D) {
    for (int i = 0; i < 1000; i++) {
        D.push_back(i);
    } 
}

int main() {
    std::vector<int> D;
    get_vectorD(D);
    std::cout << D.at(0) << std::endl;
}

填充std::vector更好方法

不要忘記,您可以使用std::iota來填充std::vector ,例如:

std::vector<int> D(1000);
std::iota(D.begin(), D.end(), 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM