为什么我的全局变量向量没有存储我的数据?

问题描述

我阅读了一个文本文件,其中包含 "," 分隔的单词。

我一行一行地阅读了这个文件

取一行后,我使用split 功能将其拆分为单词。在这里,我使用 ',' 表示行中的单独单词。

我定义了一个全局向量,所以我认为我可以将所有单词存储在该向量中。

一切正常,直到向量从 split 函数中出来。

代码工作正常。但它不会将单词存储在向量中。

在 split 函数底部你可以看到我写的那一行。 cout<<evec.size()<<endl;那一行是逐行检查vector的大小。

如果第一行有 13 个逗号分隔的单词,则显示 13 个(这意味着它存储了它)

但是一旦您退出拆分功能,该数据就不再可用。我该怎么做才能将所有单词存储在这个向量中?

#include<iostream>
#include<string>
#include<stdio.h>
#include <fstream>
#include <vector>

using namespace std;

std::vector<string> evec;


void split( string st,vector<string> evec){
   string z = " ";
   for ( char s : st){
      if ( s==','){
        evec.push_back(z);
         z = " ";
      }
      else{
         z = z + s;
      }
   }
   cout<<evec.size()<<endl;

}

int main( ){
string st;
ifstream Myfile("file.txt");
   while(getline(Myfile,st))
{
    split(st,evec);
    
}
    cout<< evec.size() <<endl;
    for (auto& it : evec) {
        cout << it << endl;
    }
   return 0;
}

解决方法

void split( string st,vector<string> evec){

split() 函数的第二个参数称为 evec。无论如何,它与恰好具有相同名称的全局变量完全无关。仅仅因为它与全局变量同名并不意味着它是同一个对象,它不是。

此外,它会按值传递给此函数。此函数更改其 evec 参数。 “按值”意味着,实际上,此参数是传递给此函数的原始参数的副本,对此参数的任何更改都不会影响传入的对象,它只是一个独立的副本。>

根据定义,“全局变量”不需要传递给函数。它是全局可访问的。只需从此函数中删除此参数即可。

另一方面,如果您真的不想使用全局变量,则需要一种不同的方法。但是你说全局变量是故意的。