yakataの情報奮闘記

プログラミングの話をします

c++で競技プログラミングをしようと思ったら標準入力で手間取った話

c++競技プログラミングをしようと思ったら標準入力で手間取った話

日本語で検索している時点で既に不利なんだけれど、わかりやすさがぜんぜん違うから日本語でつい検索してしまうのよね

誰かの言葉というわけではないのですが、こういうインデントが好きだったりします。ヤカタです。

競技プログラミングRubyでやることに色々と限界を感じてきて、どうせ新しい言語を学ぶなら速度面で一番有利なC++にしようと思って最近勉強している。 Unityとの関連からC#にしようと思って数題解いたのだが、参考記事の充実さが全然違ったので結局C++に。

前置きはこのくらいで本題は標準入力について。競技プログラミングではよく、1行で空白文字で区切った数字列が与えられる事がある。ただし、いくつの数が連なっているのかがわからない。cinは改行と空白文字の区別を行わないので、std::getlineの使用と数がわからないのでVectorの使用が必須になる。

実装例

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

int main()
{
    // 1行を空白で分割して変数に入れる
    std::string input;
    std::getline(std::cin, input);
    std::istringstream iss(input);
    std::string str;
    std::vector<int> result;
    
    while(std::getline(iss, str,' ')) {
        result.push_back(stoi(str));
    }

    int ans = 0;
    for(auto&& num : result) {
        ans += num;
        std::cout << num << std::endl;
    }
    std::cout << ans << std::endl;
} 

参考

getlineはsplitに使える こちらの記事を参考にさせていただきました。