簡體   English   中英

永久存儲緩沖區值

[英]Permanently storing a buffer value

我試圖解析文本文件的行,然后將其存儲在vector<string> 我來自Java背景,對C ++如何處理將內容分配給緩沖區的值感到困惑。 這是我的代碼:

string line;
vector<string> adsList;
ifstream inputFile;
inputFile.open("test.txt");
while(getline(inputFile, line))
{
    adsList.push_back(line);
}

在Java中,將對象復制到數據結構中后,將其插入。 在C ++中,我的理解是數據結構僅包含引用,因此任何操作都非常快。 什么是實現我要在C ++中完成的正確方法? 我還嘗試了以下代碼:

vector<string> adsList;
string line;
ifstream inputFile;
inputFile.open("test.txt");
while(getline(inputFile, line))
{
    string *temp = new string;
    *temp = line;
    adsList.push_back(*temp);
}

我的理由是創建一個新的字符串對象並進行存儲,在每次循環迭代被銷毀后將保留它。 C ++似乎可以解決Java的完全相反的問題,我很難解決這個問題。

編輯:這是test.txt的樣子:

item1 item1 item1
item2 item2 item2
item3 item3 item3
item4 item4 item4

我試圖將每行存儲為一個字符串,然后將字符串存儲在我的向量中。 因此,向量的前面將有一個值為“ item1 item1 item1”的字符串。

push_back()會進行復制,因此您的第一個代碼示例將完全按照您的要求執行。 實際上,默認情況下,所有C ++結構都存儲副本。 您必須具有一個指針容器才能不獲取副本。

由於您沒有發布完整的代碼,因此建議您嘗試一下以查看其是否正在讀取文件:

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

int main() {
  fstream inputFile("test.txt",fstream::in);
  string l;
  vector<string> v;
  while(getline(inputFile,l)) v.push_back(l);
  //Display the content of the vector:
  for(int i = 0; i < v.size(); ++i) {
    cout << v[i] << endl;
  }
  return 0;
}

您對重新引用的理解是不正確的-Java存儲的引用,C ++存儲您要求的內容,無論是pointers還是copies (請注意,您不能將引用存儲在stl容器中,等效於指針)

vector::push_back存儲項目的副本存儲在矢量-所以你不必創建一個pointer ,而new以存儲字符串堆上一些內存。

(在內部, 一些堆分配回事,但是這是實現細節std::string

在C ++中,我們要做的是存儲pointers ,而這些pointers 必須進行堆分配,否則當彈出當前堆棧幀時,指針將指向已失效的內存...但這是另一個主題。

請參閱此處以獲取代碼的簡單工作示例:

#include <iostream>
#include <vector>
#include <fstream>

int main()
{
    std::vector<std::string> adsList;
    std::string line;
    std::ifstream inputFile;
    inputFile.open("test.txt");

    // read a line from the file - store it in 'line'
    while(getline(inputFile, line))
    {
        // store a *copy* of line in the vector
        adsList.push_back(line);
    }

    // for each element in adsList vector, get a *reference* (note the '&')
    for (std::string& s : adsList)
    {
        std::cout << s << std::endl;
    }

    exit(0);
}

您最初的假設是不正確的。 通常將副本存儲在vector (忽略C ++ 11帶來的移動操作)。 通常,這是您要進行操作的方式。

如果您真的擔心速度,並且想存儲對事物的引用(實際上是指針),則可以使用std::unique_ptrstd::shared_ptr 例如:

std::vector<std::unique_ptr<std::string>> adsList;
std::string line;
inputFile.open("test.txt");
while(std::getline(inputFile, line)) {
    adsList.push_back(std::unique_ptr<std::string>(new std::string(line));
}

通常,只有在您必須能夠修改容器中的值並將修改內容反映到原始對象上時,才執行此操作-在這種情況下,您將使用std::shared_ptr 到目前為止,最常見的情況是您的第一個代碼示例。

暫無
暫無

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

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