2017-11-14 11 views
-1

私はファイルから行列を読み取っていますが、ファイルの先頭の0を保持できるように、文字列ベクトルに読み込んでいます。今私はベクトル上でいくつかの数学演算を適用したいので、私はそれを2D intベクトルにコピーしたいと思います。私はベクトルを使うのが初めてで、1Dベクトルの例がいくつかあったのを見ましたが、2Dベクトルと混同しています。2D文字列ベクトルを2D intベクトルC++に変換する最良の方法は何ですか?

std::vector< std::vector<string> > data; 
std::vector< std::vector<int> > res; 
std::ifstream f("input.txt", ios::binary); 
std::string line; 

while(std::getline(f,line)) 
{ 
    std::vector<string> line_data; 
    std::istringstream iss(line); 
    std::string value; 
    while(iss >> value) 
    { 
     line_data.push_back(value); 
} 
    data.push_back(line_data); 
} 

上記のコードは、ファイルを1行ずつ文字列として読み込み、それをdataという名前の2次元文字列ベクトルに書き込みました。私の目標は、2Dデータベクトルを2D resベクトルにコピーすることです。どのように進めるのですか?

input.txtは正方形のブール値の行列です。例えば

0101 
1010 
1100 
0001 

編集:

for (unsigned int i = 0; i < data.size(); ++i) 
{ std::vector<int> temp_data; 

    std::transform(data[i].begin(), data[i].end(), 
      std::back_inserter(temp_data), 
      [](const auto& element) { return std::stoi(element); }); 
    res.push_back(temp_data); 
} 

が、私はここで、自動エラーの無効な使用を取得しています:

I変換機能を使用してみましたし、私が得たところこれは推奨されているように私はこれが2Dベクトルのために正しいと確信していません。

+0

ご入力されたデータを見られなかったので、私はオフになる場合もありますが、私は言うだろう、代わりにiss' 'から文字列のトークンを読んで、番号をお読みください。 'int値; while(iss >> value){...} ' –

+0

私はこれを試しましたが、ファイルを読み込んでいる間に先頭の0が緩んでいます。 –

+0

これらのトークンのそれぞれを4つの数字に変換したいと考えていますか? –

答えて

3

を呼び出すラムダでstd::transformを使用するのが簡単な解決策です。ここで

は例です:

#include <string> 
#include <vector> 
#include <algorithm> 

int main() { 
    std::vector<std::string> vs = {"123", "456", "789"}; 
    std::vector<int> vi; 
    std::transform(vs.begin(), vs.end(), 
     std:back_inserter(vi), 
     [](const auto& element) { return std::stoi(element); }); 
// 'vi' now contains the integers 123, 456, 789 
} 
+0

私はこの例を見ましたが、私は2Dベクトルのためにそれを使用する方法を理解していません。 –

+0

@Ashwin Ramesh私が投稿した例は一次元を扱っていますが、私は読者のための運動として他のものを残しましたが、それは簡単です。その周りに 'for'ループをラップするだけです。別の' transform'もあります。 –

+0

@ Jesper Juhl、あなたが提案したものを編集しましたが、コードを確認してください。 –