【问题标题】:How to add integers and strings in the same vector?如何在同一个向量中添加整数和字符串?
【发布时间】:2017-09-29 12:44:29
【问题描述】:

我的大学作业需要帮助。我还是新手。

基本上我正在做一个行程编码,我不知道如何在计数器后面添加字母:

#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>

void error(std::string str)
{
    throw std::runtime_error(str);
}

int main()
{       int counter = 1;
        std::string id;
        std::vector<int> v;
        std::cout << "Enter the data to be compressed: ";
        std::cin >> id;

        try
        {   for(int i = 0; i < id.size(); i++)
            {
                if(std::isdigit(id[i]))
                   error("invalid input");
            }

            std::cout << "The compressed data is: ";
            for(int i = 0; i < id.size(); i++)
            {
                if(id[i] == id[i+1])
               {
                   counter++;
               }
               else if(id[i]!= id[i+1])
               {
                   v.push_back(counter);
                   v.push_back(id[i]);
                   counter=1;
               }
            }
            for(int j = 0; j < v.size(); j++)
                std::cout << v[j];
        }
        catch(std::runtime_error& str)
        {
            std::cerr << "error: " << str.what() << std::endl;
            return 1;
        }

 return 0;
}

例如,如果我输入 aaabbb,probram 应该输出 3a3b。问题是它输出 397398 97 和 98 是 a 和 b 的 ascii 代码。 我不知道如何把字母放在柜台后面,让它们在同一个向量中。

【问题讨论】:

  • 听起来你需要一个class 来封装构成一大块编码数据(一个数量和一个字母)的两条条信息。
  • 问题是我们的课还是没学好,不知道怎么学好
  • 听起来像是一个并行的“数组”问题
  • 然后将所有内容存储为std::string?
  • @czarczar 您必须使用to_string 将int 转换为`strign`。

标签: c++ run-length-encoding


【解决方案1】:

如果你想序列化为字符串试试这个:

#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
#include <sstream>

void error(std::string str) {
throw std::runtime_error(str);
}

int main() {


std::ostringstream stream;
int counter = 1;
std::string id;

std::cout << "Enter the data to be compressed: ";
std::cin >> id;

try {
    for (int i = 0; i < id.size(); i++) {
        if (std::isdigit(id[i]))
            error("invalid input");
    }

    std::cout << "The compressed data is: ";
    for (int i = 0; i < id.size(); i++) {
        if (id[i] == id[i + 1]) {
            counter++;
        } else if (id[i] != id[i + 1]) {
            stream << counter;
            stream << (char) id[i];

            counter = 1;
        }
    }


    std::cout <<  stream.str() << std::endl;

} catch (std::runtime_error& str) {
    std::cerr << "error: " << str.what() << std::endl;
    return 1;
}
}

【讨论】:

    【解决方案2】:

    来自std::cout &lt;&lt; v[j] 的v[j] 是int 类型,这就是std::cout 写入数字的原因。要将其写为字符,您应该将v[j] 转换为char,如下所示:std::cout &lt;&lt; (char)v[j]。这样,std::cout 将使用 char 特化,而不是 int。

    【讨论】:

      【解决方案3】:

      虽然其他答案可能会为您提供所需的输出,但我相信解决此问题的惯用方法是使用一个类来保存字符及其计数。有两个明显的选择。

      std::pair

      也可以是std::tuple,如果您出于一致性或其他原因更喜欢它。将结果保存在 std::vector&lt;std::pair&lt;char, int&gt; 中。这会保存信息,但要打印它,您需要定义一个适当的函数。通过添加元素

      v.emplace_back(character, count);
      

      包装类

      如果您想在没有外部帮助类的情况下提供某些功能,请定义一个自定义包装类,如下所示。

      class CharacterCount {
      private:
          char character;
          int count;
      
      public:
          CharacterCount(char character, int count):
              character(character), count(count) {}
      
          explicit operator std::string() const { return std::to_string(count) + character;
      
          // Other helper functions or constructors you require
      }
      

      这简化了打印

      for (auto& character_count : v)
          std::cout << static_cast<std::string>(character_count);
      

      我相信因为std::ostream::operator&lt;&lt; 是模板化的,所以您无法隐式转换为std::string 工作。无论如何,我建议不要进行隐式转换。

      您可以使用与以前相同的 emplace_back 语法,因为我们提供了适当的构造函数。

      【讨论】:

        【解决方案4】:

        因此,您在string 中输入您的输入,最终只需将这些信息流式传输出去,最终意味着没有理由将信息存储在vector 中,只需输出它!您可以使用 find_if 和 lambda 来查找非连续字符(如果您愿意,也可以使用 find_if_not。)

        for(string::const_iterator finish, start = cbegin(id); start != cend(id); start = finish) {
            finish = find_if(start, cend(id), [value = *start](const auto i) { return i != value; } );
        
            cout << distance(start, finish) << *start;
        }
        

        Live Example

        【讨论】:

          猜你喜欢
          • 2019-06-03
          • 2019-11-30
          • 2023-03-17
          • 1970-01-01
          • 2022-12-04
          • 2013-02-16
          • 1970-01-01
          • 2013-11-02
          • 2020-10-27
          相关资源
          最近更新 更多