如何在同一向量中添加整数和字符串?

时间:2017-09-29 12:44:30

标签: c++ run-length-encoding

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

基本上我正在进行游程编码,而且我不知道如何在计数器后添加字母:

#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代码。 我不知道如何将信件放在柜台后面,并让他们在同一个载体中。

4 个答案:

答案 0 :(得分:0)

如果您想序列化为字符串,请尝试以下方法:

#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;
}
}

答案 1 :(得分:0)

来自v[j]

std::cout << v[j]类型为int,这就是std::cout写入数字的原因。要将其编写为角色,您应该将v[j]投射到char,如下所示:std::cout << (char)v[j]。这样,std::cout将使用char专精,而不是int专长。

答案 2 :(得分:0)

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

的std ::对

如果您因为一致性或其他原因而喜欢它,也可以是std::tuple。将结果保存在std::vector<std::pair<char, int>。这样可以保存信息,但要打印它,您需要定义一个合适的功能。通过

添加元素
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<<是模板化的,所以无法隐式转换为std::string。无论如何,我会建议不要进行隐式转换。

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

答案 3 :(得分:0)

所以你在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