簡體   English   中英

C ++向量和指標

[英]c++ vectors and pointers

據我了解,如果我不存儲指針,c ++中的所有內容都會被復制,這可能導致性能下降(忽略示例的簡單性)。 所以我以為我將對象存儲為指針而不是向量中的字符串對象,這對性能更好嗎? (令人震驚的是我的弦很長,而且很多)。

當我嘗試遍歷字符串指針的向量時的問題是我無法從它們中提取實際值

string test = "my-name";
vector<string*> names(20);
names.push_back(&test);

vector<string*>::iterator iterator = names.begin();
while (iterator != names.end())
{
    std::cout << (*iterator) << ":" << std::endl;
    // std::cout << *(*iterator); // fails

    iterator++;
}

看到注釋行,我在接收字符串指針時沒有問題。 但是,當我嘗試獲取字符串指針值時,我得到了一個錯誤(我找不到錯誤完全是什么,但程序只是失敗了)。

我也嘗試將( 迭代器)存儲在新的字符串變量中,但這沒有幫助嗎?

您已經創建了向量並將其初始化為包含20個項目。 這些項正在默認初始化,在指針的情況下為空指針。 該程序在解引用那些空指針時遇到麻煩。

一條建議是在您遇到問題之前,不要擔心最有效的方法。 此代碼肯定會工作有更好的vector<string>與一個vector<string*>

不,不,不超過一千次

不要過早優化。 如果程序運行很快,則無需擔心性能。 在這種情況下,由於每個對象僅是單個指針的目標,因此指針顯然會通過消耗內存和時間來降低性能!

更不用說手動指針編程容易引入錯誤,特別是對於新手。 犧牲性能的正確性和穩定性是一個巨大的倒退。

C ++的優點是通過提供封裝的數據結構和算法簡化了優化過程。 因此,當您決定進行優化時,通常可以通過交換標准零件來實現。

如果您想了解有關優化數據結構的信息,請閱讀智能指針

這可能是您想要的程序:

vector<string> names(20, "my-name");

for ( vector<string>::iterator iterator = names.begin();
      iterator != names.end();
      ++ iterator )
{
    std::cout << *iterator << '\n';
}

您的代碼看起來像是將指向基於堆棧的變量的指針存儲到向量中。 一旦聲明了字符串的函數返回,該字符串就會變成垃圾並且指針無效。 如果要將指針存儲到向量中,則可能需要動態分配字符串(使用new)。

看一下您的初始化:

string test = "my-name";
vector<string*> names(20);
names.push_back(&test);

首先創建一個包含20個元素的std::vector

然后,使用push_back附加第21個元素,該元素指向有效的string 很好,但是該元素永遠不會在循環中到達:第一次迭代已經崩潰,因為向量中存儲的前20個指針未指向有效的string s。

取消引用無效的指針會導致崩潰。 如果確保向量中具有有效的指針,則**iterator可以很好地訪問元素。

嘗試

if (*iterator)
{
  std::cout << *(*iterator) << ":" << std::endl;
}

馬克·蘭瑟姆(Mark Ransom)解釋了為什么現在有些指針

string test = "my-name";
vector<string*> names(20);

向量的size為20,這意味着它可以容納20個字符串指針。

names.push_back(&test);

通過push_back操作,您將省略前20個元素,並向保存test的地址的向量添加一個新元素。 vector的前20個元素未初始化,可能指向垃圾。 while循環一直運行到大小為21的向量的末尾,並且取消引用未初始化的指針是導致問題的原因。 由於vector的大小可以通過push_back操作動態增加,因此無需明確提及大小。

vector<string*> names; // Not explicitly mentioning the size and the rest of
                       // the program should work as expected.

暫無
暫無

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

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