当前位置: 首页 > 知识库问答 >
问题:

在multimap中插入值时出现未知错误

计胤
2023-03-14

我有下面的代码,在这里我尝试将值插入到2个字符串的multimap中,但是我不断得到一个我无法理解的错误。我已经想解决这件事好几个小时了。

该程序的全部要点是基于多映射插入的自动排序对字典的行进行排序。

// sort_entries_of_multiple_dictionaries.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <iomanip>
#include <sstream>

// Prototypes
int indexDict(std::multimap<std::string, std::string>& dict);


int main()
{
    std::multimap<std::string, std::string> dict;
    
    if(indexDict(dict) == 0)
        return 0;


}


int indexDict(std::multimap<std::string, std::string>& dict)
{
    std::ifstream inputFile{ "output.txt", std::ios::in };
    std::string currentDictEntry{};
    size_t currentLine{};

    if (!inputFile)
    {
        std::cerr << "input.txt FILE NOT FOUND in the current directory" << std::endl;
        system("pause");
        return 0;
    }

    while (std::getline(inputFile, currentDictEntry))
    {
        //std::cout << currentDictEntry << std::endl; // TO DELETE

        std::string currentWord{};
        size_t delimiterPos = currentDictEntry.find('\t', 0);

        if (delimiterPos == std::string::npos)
            std::cerr << "ERROR. Delimiter \"<b>\" not found in line " << currentLine << std::endl;
        else
        {
            //std::cout << "pos of \\t = " << delimiterPos << std::endl; // TO DELETE
            for (char& ch : currentDictEntry)
            {
                if (ch != '\t')
                {
                    currentWord += ch;
                }
                else
                    break;

            }
            std::cout << currentWord /* << '|' */ << std::endl; // TO DELETE

            auto value = currentDictEntry.substr(delimiterPos, std::string::npos);

            std::cout << "size= " << value.size() << '|' << value << std::endl;

            dict.insert( currentWord, currentWord/*, value*/ );
        }

        if (currentLine == 50) return 0; // TO DELETE


        currentLine++;
    }

    return 1;
}
        if (currentLine == 50) return 0; // TO DELETE


        currentLine++;
    }

    return 1;
}

我不断得到的错误是:

unary '++': '_Iter' does not define this operator or a conversion to a type acceptable to the predefined operator

illegal indirection

共有2个答案

曾嘉言
2023-03-14

我更改dict.insert(currentWord,currentWord/*,Value*/);dict.insert({currentWord,currentWord});和错误已解决

充煌
2023-03-14

正如@evg所说,它接受std::pair

dict.insert(std::make_pair(currentWord, value));

如果我正确理解了您的意图,您不希望将\t保存到您的结果中,因此在delimiterpos后面添加1以获得正确的值:

auto value = currentDictEntry.substr(delimiterPos + 1, std::string::npos);

试运行。output.txt:

4   d
1   a
2   b
3   c
0   

输出:

"0" - ""
"1" - "a"
"2" - "b"
"3" - "c"
"4" - "d"

完整代码:

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <iomanip>
#include <sstream>

// Prototypes
int indexDict(std::multimap<std::string, std::string>& dict);


int main()
{
    std::multimap<std::string, std::string> dict;

    if (indexDict(dict) == 0)
        return 0;

    for (auto& i : dict) {
        std::cout << "\"" << i.first << "\" - \"" << i.second << "\"\n";
    }
}


int indexDict(std::multimap<std::string, std::string>& dict)
{
    std::ifstream inputFile{ "output.txt", std::ios::in };
    std::string currentDictEntry{};
    size_t currentLine{};

    if (!inputFile)
    {
        std::cerr << "output.txt FILE NOT FOUND in the current directory" << std::endl;
        system("pause");
        return 0;
    }

    while (std::getline(inputFile, currentDictEntry))
    {
        //std::cout << currentDictEntry << std::endl; // TO DELETE

        std::string currentWord{};
        size_t delimiterPos = currentDictEntry.find('\t', 0);

        if (delimiterPos == std::string::npos)
            std::cerr << "ERROR. Delimiter \"<b>\" not found in line " << currentLine << std::endl;
        else
        {
            //std::cout << "pos of \\t = " << delimiterPos << std::endl; // TO DELETE
            for (char& ch : currentDictEntry)
            {
                if (ch != '\t')
                {
                    currentWord += ch;
                }
                else
                    break;

            }
            std::cout << currentWord /* << '|' */ << std::endl; // TO DELETE

            auto value = currentDictEntry.substr(delimiterPos + 1, std::string::npos);

            std::cout << "size= " << value.size() << '|' << value << std::endl;

            dict.insert(std::make_pair(currentWord, value));
        }

        if (currentLine == 50) return 0; // TO DELETE


        currentLine++;
    }

    return 1;
}

代码中的小错误:您不需要 。此外,您的错误消息是input.txt而不是output.txt

 类似资料:
  • 我是robolectric新手,我只想运行简单测试。 我使用Android Studio=>Gradle 如何找到错误的真正源头?零点异常在哪里?

  • 问题内容: 我正在尝试在MS Access中的表上进行操作。一切正常 一个声明。但是当执行其他三个操作时,我似乎什么也没得到 错误,但操作未反映在数据库上。请帮忙… 该声明如下: 我也可以知道为什么除了SELECT语句之外使用… 我收到此错误: 这是我的代码… 问题答案: 当您不提交 / 关闭连接时,可能会发生这种情况。确保在执行该语句之后提交连接,并在获取和执行它们的块的块中关闭连接(以及语句和

  • 我是一个Android Studio的初学者,我恳求原谅和写作错误。当我尝试安装电子商务应用程序时,我得到了这个错误,然而我尝试在网上搜索同样的,却找不到。你能告诉我这个错误是怎么回事吗?之前这个项目使用会话管理器进行身份验证,我遇到这个问题时尝试使用Firebase。请张贴任何相关链接。10/01 13:04:25:在Micromax Micromax Q391上启动“应用程序”。安装未成功。无

  • 我从API中得到了一个字符串列表,当我尝试插入Room Db时,我得到了一个错误- 参数的 这是它的桌子 我如何解决这个错误,或者有没有其他的方法让这个东西工作。

  • 我正在我的ubuntu 18.04机器上运行mongo shell。我正在集合中插入文档 我尝试创建多个键,如:'db。Pricing.insert({key1:{key1a: value}, key2:{key2a: value},{key2b: value}, key3:{key3a: value}})' ”“db。定价插入({图像:{“在书中使用”:100},纸张:{“在书中”:0-20},

  • 问题内容: 下面是用户单击“ 应用余额” 时的代码 。 这适用于第一部分,用户的余额更新很好,但是当我尝试执行第二条语句时,出现SQL语法错误。是什么原因引起的? 下面是运行此命令时得到的堆栈跟踪。 问题答案: 您的第二个查询缺少子句中的右括号。 代替直接在查询中附加参数,请使用参数化查询。 这样看起来会更干净,更容易编写。最重要的是,它将使您免受SQL Injection 攻击。 这是用于参数化