質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

2回答

661閲覧

C++ vector参照渡しで要素追加をしたい

Sakurami

総合スコア2

0グッド

0クリップ

投稿2023/05/30 14:47

実現したいこと

C++でvectorを参照渡しして、要素を追加するユーザ関数を作ろうとしています。
空白を含む文字列を空白で区切ってvectorに格納する機能を持った関数です。

前提

vectorを渡しても要素を追加することができない状態です。

発生している問題・エラーメッセージ

なし

該当のソースコード

C++

1#include <iostream> 2#include <string> 3#include <vector> 4#include <algorithm> 5#include <iterator> 6 7using namespace std; 8 9void vectorSplit(vector<string> &v,string str); 10 11int main() 12{ 13 string s; 14 while(1) { 15 getline(cin,s); 16 cout << s << endl; 17 if(cin.fail()) { 18 cout << "unti" << endl; 19 break; 20 } 21 vector<string> info; 22 vectorSplit(info,s); 23 cout << info.size() << endl; 24 } 25} 26 27void vectorSplit(vector<string> &v,string str) 28{ 29 string tmp = ""; 30 for(int i=0;i<str.length()-1;i++) { 31 if(str[i] == ' ') { 32 cout << tmp << endl; 33 v.push_back(tmp); 34 tmp = ""; 35 continue; 36 } 37 tmp += str[i]; 38 } 39} 40

試したこと

vectorSplitにvectorを渡してもサイズが0のままです。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/05/30 15:08

再現しません。vector::size() は変化します。
int32_t

2023/05/30 22:46

実行時にどんな入力をして動作確認していますか? 「cout << tmp << endl;」は実行されましたか?
episteme

2023/05/30 23:54

ふたつ以上の空白が続いたときに誤作動するけど、いいのかな?
guest

回答2

0

[ご参考] 僕ならこう書く(vectorの参照渡しではなく、イテレータ渡し):

C++

1#include <string> 2 3template <typename OutputIterator> 4OutputIterator split(OutputIterator out, const std::string& str, 5 const std::string& delim =" \t\n") { 6 std::string token; 7 bool in_token = false; 8 for ( char ch : str ) { 9 if ( delim.find(ch) != std::string::npos ) { 10 if ( in_token ) { *out++ = token; in_token = false; } 11 } else { 12 if ( in_token ) { token += ch; } 13 else { token = ch; in_token = true; } 14 } 15 } 16 if ( in_token ) { *out++ = token; } 17 return out; 18} 19 20// ----- おためし 21 22#include <vector> 23#include <iostream> 24#include <iterator> 25 26int main() { 27 using namespace std; 28 while ( true ) { 29 string s; 30 getline(cin,s); 31 if(cin.fail()) { 32 cout << "unti" << endl; 33 break; 34 } 35 vector<string> info; 36 split(back_inserter(info), s); 37 for ( const auto& item : info ) { 38 cout << '[' << item << "] "; 39 } 40 cout << endl; 41 } 42}

投稿2023/05/31 02:29

編集2023/05/31 02:33
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問文の vectorSplit() は、

  • 空白が含まれていない入力文字列だと何も起きない
  • 入力文字列の最後の1文字が無視される

という問題があるように見えます。

c++

1 for (int i = 0; i < str.length(); ++i) { // length() から1引く必要はない 2 ... 3 } 4 v.push_back(tmp); // forループ後に最後の項目を追加する必要がある 5

投稿2023/05/30 23:02

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問