2017-09-29 14 views
0

大学の宿題に助けが必要です。私はまだこれに新しいです。整数と文字列を同じベクトルに追加する方法は?

基本的に私は、ランレングス符号化をやっていると私はカウンターの後に文字を追加する方法がわからない:

#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場合。問題は、aとbのASCIIコードである397398 97と98を出力することです。 私は、カウンターの後ろに文字を置く方法と、同じベクトルにする方法を知らない。

+2

サウンズあなたが情報の* 2つの*の部分をカプセル化するために 'class'を必要とするようにエンコードされたデータ(量と文字)のチャンクを構成します。 – crashmstr

+0

私たちはまだクラスを正しく学んでいないし、どうやってそれをどうやってやるのか分かりません。 –

+0

それは平行な "配列"問題のようですね – NathanOliver

答えて

0

あなたは文字列は、この試すとしてシリアライズしたい場合:std::cout << v[j]から

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

v[j]をタイプintのものであり、std::coutは番号を書き込む理由です。文字として書き込むには、v[j]charにキャストしてください(std::cout << (char)v[j])。このように、std::coutは、intではなく、charの専門用語を使用します。

0

他の回答では必要な出力が得られるかもしれませんが、これを解決するための慣用的な方法は、文字とそのカウントの両方を保持するクラスを使用することです。明らかに2つの選択肢があります。あなたは一貫性または何らかの理由でそれを好む場合

の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 
} 

これは私がstd::ostream::operator<<はテンプレートなので、あなたがstd::stringへの暗黙的な変換は、仕事を得ることができないと信じて

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

を印刷簡素化します。とにかく私は暗黙の変換に対して助言します。

私たちは適切なコンストラクタを提供しているので、前述のように同じemplace_back構文を使用することができます。

0

あなたはstringであなたの入力を受け取り、究極的にはこの情報をストリーミングする必要があります。究極的には、vectorに情報を格納する理由はありません。 (ご希望の場合はfind_if_not。)あなたは非連続的な文字を見つけるために、ラムダとfind_ifを使用することができます

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

関連する問題