为什么我的std :: Map失去了价值

Why is my std::map losing its values?

本文关键字:失去 Map 我的 std 为什么      更新时间:2023-10-16

我有一个具有成员对象polymap的类多项式。

std::map<int,int> polyMap;
Polynomial() {}
Polynomial(const Polynomial& rhs){
    polyMap=rhs.polyMap;
}
~Polynomial() {
}

我正在读取文件中的行,并使用成对的int对映射填充图,一个是键,另一个作为值。

我使用函数从文本文件中填充多个多项式,并填充其地图

Polynomial* populateFields(const char* filename) {
ifstream infile(filename);
int i;
int z;
string s;
Polynomial* arr = new Polynomial[numLinesInFile(filename)];
int index = 0;
while (!infile.eof()) {
    getline(infile, s);
    stringstream t(s);
    Polynomial* poly = new Polynomial;
    arr[index] = *poly;
    index = index + 1;
    while (t >> i >> z) {
        poly->polyMap[z] = i;
      }
    }
   return arr;
 }

当我尝试访问主函数中的多项式映射时,其值始终返回零。

为什么我的地图丢失了值?据我了解,地图是智能指针,地图对象destructor是否在我的PopulateFields功能的末尾被调用?

您在初始化数据之前进行副本:

while (getline(infile, s)) {
    stringstream t(s);
    Polynomial poly;
    while (t >> i >> z) {
        poly.polyMap[z] = i;
    }
    arr[index] = poly;
    index = index + 1;
}

或用std::vector重写:

std::vector<Polynomial> populateFields(const char* filename) {
    std::vector<Polynomial> res;
    std::ifstream infile(filename);
    std::string s;
    while (getline(infile, s)) {
        std::stringstream t(s);
        res.emplace_back();
        Polynomial& poly = res.back();
        int i;
        int z;
        while (t >> i >> z) {
            poly.polyMap[z] = i;
        }
    }
    return res;
 }

这是做到这一点的另一种方法:

#include <vector>
#include <map>
#include <fstream>
#include <string>
#include <sstream>
struct Polynomial {
    Polynomial(const std::string& line) {
        std::istringstream iss{line};
        for(int i{}, z{}; iss >> i >> z;)
            polyMap[z] = i;
    }
    std::map<int, int> polyMap;
};
std::istream& operator>>(std::istream& is, std::vector<Polynomial>& poly)
{
    for(std::string line; std::getline(is, line);)
        poly.emplace_back(line);
    return is;
}
int main()
{
    std::vector<Polynomial> polys;
    std::ifstream{"infile.txt"} >> polys;
}