前スレ
C++相談室 part156
https://mevius.5ch.net/test/read.cgi/tech/1621389313/
探検
C++相談室 part157
レス数が950を超えています。1000を超えると書き込みができなくなります。
2021/08/09(月) 10:57:31.60ID:JaaB5Egp
871デフォルトの名無しさん
2021/10/25(月) 18:04:59.44ID:LmZJdmU+ >>857の原因判明しました。
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。
https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant
上記に従った対策コードは以下のとおりです。
https://godbolt.org/z/8e9o3MnaG
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。
https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant
上記に従った対策コードは以下のとおりです。
https://godbolt.org/z/8e9o3MnaG
872デフォルトの名無しさん
2021/10/25(月) 20:01:58.87ID:VZsrHh6g >>866
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
873デフォルトの名無しさん
2021/10/25(月) 21:34:55.28ID:3IW01+t9 演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
874デフォルトの名無しさん
2021/10/25(月) 21:35:04.23ID:EqTxifVC while (fread(&x, sizeof(double), 1, fin) > 0) {
fprintf(fout, "%5.4f\n", x);
}
こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
fprintf(fout, "%5.4f\n", x);
}
こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
875デフォルトの名無しさん
2021/10/26(火) 06:12:19.30ID:lDQyydUS >>874
そんなのシノプシスに聞けよ…
そんなのシノプシスに聞けよ…
876デフォルトの名無しさん
2021/10/26(火) 06:48:54.44ID:ch+2e+/f >>870
昔のAPLとかかw
昔のAPLとかかw
877デフォルトの名無しさん
2021/10/26(火) 08:08:42.05ID:a/qQal0X 演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ?
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
878デフォルトの名無しさん
2021/10/26(火) 08:14:06.41ID:FOkaXEb/ ん? それこそが名前空間の可視性制御だろ
879デフォルトの名無しさん
2021/10/26(火) 08:14:48.16ID:X4knYEql 関数内で構造体を定義し、その中でstatic関数を定義する
880デフォルトの名無しさん
2021/10/26(火) 08:15:27.77ID:X4knYEql あ、違った
class内のprivate関数でいいんじゃね
class内のprivate関数でいいんじゃね
881デフォルトの名無しさん
2021/10/26(火) 08:27:02.14ID:cqUp+YH+882デフォルトの名無しさん
2021/10/26(火) 09:22:33.47ID:tIXOLnPL883デフォルトの名無しさん
2021/10/26(火) 10:05:37.17ID:I5hwU/3x >>874
fprintfはええんか?
fprintfはええんか?
884デフォルトの名無しさん
2021/10/26(火) 10:21:21.31ID:g/XkL0k7 niebloidの出番じゃないの?演算子オーバーロードには使えないが
885デフォルトの名無しさん
2021/10/26(火) 12:31:52.75ID:E+rw0Wy/886デフォルトの名無しさん
2021/10/26(火) 12:54:35.40ID:FaeDWsHu 今日もまた単発IDの曖昧発言onlyですね
887ハノン ◆QZaw55cn4c
2021/10/31(日) 10:43:09.43ID:hT9enBIH テステス
888デフォルトの名無しさん
2021/11/01(月) 17:04:38.20ID:uZUsIwlp std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない
参照で渡して良いですか
参照で渡して良いですか
889デフォルトの名無しさん
2021/11/01(月) 17:28:34.89ID:2TKPTRzu std::funcて中身は関数ポインタ―でしょ
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
890はちみつ餃子 ◆8X2XSCHEME
2021/11/01(月) 17:29:06.34ID:w5vOXkrp >>888
「引数にとる」というのは実引数の型も std::function 型という意味?
「引数にとる」というのは実引数の型も std::function 型という意味?
891デフォルトの名無しさん
2021/11/01(月) 17:41:35.71ID:ja4QDiEt892デフォルトの名無しさん
2021/11/01(月) 17:42:17.47ID:P2kjdACs コピーだろー
893デフォルトの名無しさん
2021/11/01(月) 17:54:17.61ID:uZUsIwlp >>890
関数を想定しています
関数を想定しています
894はちみつ餃子 ◆8X2XSCHEME
2021/11/01(月) 17:58:12.22ID:w5vOXkrp >>893
仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは
変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。
これは std::function に限らない一般原則。
どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは
変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。
これは std::function に限らない一般原則。
どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
895デフォルトの名無しさん
2021/11/01(月) 18:35:36.43ID:XqzqlHR8 クラスのメンバーにstd::functionをいくつか用意しておいて、
条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
896デフォルトの名無しさん
2021/11/01(月) 19:28:38.40ID:Qg2QcgLf この流れで質問をば。
std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん?
継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん?
継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
897デフォルトの名無しさん
2021/11/01(月) 19:49:46.26ID:Iw+wFADq anyの使いどころ?
898896
2021/11/01(月) 20:35:42.39ID:0sJcc+2w anyだとメソッドを呼び出せないから機能が足りないですな。
メソッド呼び出しできるインターフェイス付きanyみたいな感じ。
用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
メソッド呼び出しできるインターフェイス付きanyみたいな感じ。
用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
899デフォルトの名無しさん
2021/11/01(月) 20:39:54.69ID:ja4QDiEt 理解できてないけど普通のテンプレート引数を持つ関数じゃいかんの?
900896
2021/11/01(月) 21:35:17.71ID:0sJcc+2w Haskellの型タイプというのがイメージに近いか。
具体例をだしてみると、
class A { public: string test1() { return string("A1"); }; string test2() { return string("A2"); }; };
class B { public: string test1() { return string("B1"); }; string test2() { return string("B2"); }; };
vector<generic_ptr<string test()>>c;
c.push_back(make_shared<A>());
c.push_back(make_shared<B>());
c[0]->test1(); // A1
c[1]->test1(); // B1
c[0]->test2(); // A2
c[1]->test2(); // B2
みたいに、anyみたいに雑多なオブジェクトをブチ込むけど、
anyとは違ってそのまま共通メソッドを呼び出せるようにする、
というのが狙いね。
具体例をだしてみると、
class A { public: string test1() { return string("A1"); }; string test2() { return string("A2"); }; };
class B { public: string test1() { return string("B1"); }; string test2() { return string("B2"); }; };
vector<generic_ptr<string test()>>c;
c.push_back(make_shared<A>());
c.push_back(make_shared<B>());
c[0]->test1(); // A1
c[1]->test1(); // B1
c[0]->test2(); // A2
c[1]->test2(); // B2
みたいに、anyみたいに雑多なオブジェクトをブチ込むけど、
anyとは違ってそのまま共通メソッドを呼び出せるようにする、
というのが狙いね。
901デフォルトの名無しさん
2021/11/01(月) 22:33:44.83ID:JtJuMIHt902896
2021/11/02(火) 00:28:12.27ID:F29rpsLU >901
ありがとう。こういうのもあるのね
……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。
もうちょっと試してみるか。
ありがとう。こういうのもあるのね
……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。
もうちょっと試してみるか。
903デフォルトの名無しさん
2021/11/02(火) 10:51:55.89ID:7a5iqwfV std::thread で作られるスレッドって
スタックサイズはデフォルトいくつなん?
変更とかできるん?
スタックサイズはデフォルトいくつなん?
変更とかできるん?
904デフォルトの名無しさん
2021/11/02(火) 10:59:21.25ID:oKrr57AH >>903
スタックなんて概念がないのに制御できるわけがない
スタックなんて概念がないのに制御できるわけがない
905デフォルトの名無しさん
2021/11/02(火) 11:48:47.80ID:LR6fq+wY linuxならulimit -sかpthread_attr_setstacksizeで設定できる
ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない
そしてC++とか関係ない
ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない
そしてC++とか関係ない
906デフォルトの名無しさん
2021/11/02(火) 13:09:21.89ID:TehqQXLJ stdよりposixのほうが洗練されてるよな
907デフォルトの名無しさん
2021/11/02(火) 17:28:47.39ID:LR6fq+wY 何いってんの?この人
908デフォルトの名無しさん
2021/11/02(火) 19:04:22.54ID:TehqQXLJ 意味わかんなくてpthread使ってんなら相当頭悪い
909デフォルトの名無しさん
2021/11/02(火) 19:13:49.36ID:U4IKz2Wy むだに喧嘩すんなよ
910デフォルトの名無しさん
2021/11/02(火) 19:28:12.57ID:LR6fq+wY 比較対象がおかしいんだからしょうがなくね?w
911デフォルトの名無しさん
2021/11/05(金) 00:18:59.36ID:2vTbLoUN 基底クラスに定数持たせるけど値は継承先で決めたい。
例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。
下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。
class Car
{
protected:
const double weight, height, width;
public:
Car(double w, double h, double wd)
: weight(w)
, height(h)
, width(wd)
{}
};
class CarA : public Car
{
CarA() : Car(1000.0, 1.8, 1,8) {}
};
例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。
下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。
class Car
{
protected:
const double weight, height, width;
public:
Car(double w, double h, double wd)
: weight(w)
, height(h)
, width(wd)
{}
};
class CarA : public Car
{
CarA() : Car(1000.0, 1.8, 1,8) {}
};
912デフォルトの名無しさん
2021/11/05(金) 00:22:58.93ID:O1PLiy99 別に普通だと思うけどどの辺が見づらいと思うんだ?
913はちみつ餃子 ◆8X2XSCHEME
2021/11/05(金) 01:26:19.60ID:8QrXrM3i 値が const であるだけでなく static であって欲しいという意図なんじゃないかと想像する。
914デフォルトの名無しさん
2021/11/05(金) 01:29:07.53ID:zGuhJhpK クラステンプレート化すればいいじゃない
template<double W, double H, double WD>
template<double W, double H, double WD>
915デフォルトの名無しさん
2021/11/05(金) 01:41:20.30ID:gd3zcTPm doubleってテンプレート引数OKになったの?
917デフォルトの名無しさん
2021/11/05(金) 02:25:46.30ID:Xs8oV2Az C++20では普通に使えるかもだけど、引数に名前を付ける風のトリックがあるらしい
https://www.fluentcpp.com/2018/12/14/named-arguments-cpp/
https://www.fluentcpp.com/2018/12/14/named-arguments-cpp/
918デフォルトの名無しさん
2021/11/05(金) 05:55:16.82ID:caWVwyr0919デフォルトの名無しさん
2021/11/05(金) 06:25:31.61ID:8h2e+y9J920デフォルトの名無しさん
2021/11/05(金) 07:38:38.22ID:gd3zcTPm C++20で指示付き初期化が出来るようなので、もしC++20が使えるなら定数を構造体にまとめたらいいかも
https://cpprefjp.github.io/lang/cpp20/designated_initialization.html
https://cpprefjp.github.io/lang/cpp20/designated_initialization.html
921デフォルトの名無しさん
2021/11/05(金) 08:22:45.14ID:OHT8JXtH922デフォルトの名無しさん
2021/11/05(金) 12:38:49.71ID:gSSLx8YQ923デフォルトの名無しさん
2021/11/05(金) 13:46:37.13ID:Xs8oV2Az >>920
C++20で使えるのそれそれ。gccでは元々使えるけど...
C++20で使えるのそれそれ。gccでは元々使えるけど...
924はちみつ餃子 ◆8X2XSCHEME
2021/11/05(金) 13:57:04.43ID:8QrXrM3i >>923
C (C99 以降) には有るからついでに C++ でも使えるようにするのは gcc 的にはたいした手間でもなかったんだろうと思う。
C (C99 以降) には有るからついでに C++ でも使えるようにするのは gcc 的にはたいした手間でもなかったんだろうと思う。
925はちみつ餃子 ◆8X2XSCHEME
2021/11/05(金) 14:01:00.76ID:8QrXrM3i ところで C の designated initializer では配列要素を指示することも出来るんだけど、 C++20 にはこれは入らなかったんだね。
↓ こういうの。
const char *foo[5] = {
[2]="bar"
};
↓ こういうの。
const char *foo[5] = {
[2]="bar"
};
926デフォルトの名無しさん
2021/11/05(金) 14:04:47.27ID:XqgFcDRs c++17以前でも引数を構造体にまとめれば{}で区切って記述できるようになるから多少マシにはなるよね
IntelliSenseが効きにくくなるのが欠点だけど
IntelliSenseが効きにくくなるのが欠点だけど
927デフォルトの名無しさん
2021/11/05(金) 14:10:59.42ID:TiWO+rcp >>922
君は何を言っているんだい?
君は何を言っているんだい?
928デフォルトの名無しさん
2021/11/05(金) 14:27:51.72ID:7LuUsMxr そのCの記述素晴らしいよね
C++的でないのはわかるがどうせ初期化時でしか使わんのだしとっとと入れるべきだった
C++的でないのはわかるがどうせ初期化時でしか使わんのだしとっとと入れるべきだった
929デフォルトの名無しさん
2021/11/05(金) 16:10:31.37ID:gd3zcTPm >>925 ラムダ式のキャプチャと競合するためと書いてるね
930デフォルトの名無しさん
2021/11/07(日) 16:47:32.00ID:qipzvPRM https://ideone.com/d05dJ9
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T>
// template <class T, size_t C=MAX_SIZE>
class SizeLimitedAllocator {
public:
typedef T value_type;
using traits = allocator_traits<allocator<T>>;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
// if (n > C) throw bad_alloc();
return traits::allocate(_allocator, n);
}
void deallocate(T *p, size_t n) {
traits::deallocate(_allocator, p, n);
}
private:
allocator<T> _allocator;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}
このコードをコメント側に変更してコンパイルするとこけるんだけど、なんで?
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T>
// template <class T, size_t C=MAX_SIZE>
class SizeLimitedAllocator {
public:
typedef T value_type;
using traits = allocator_traits<allocator<T>>;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
// if (n > C) throw bad_alloc();
return traits::allocate(_allocator, n);
}
void deallocate(T *p, size_t n) {
traits::deallocate(_allocator, p, n);
}
private:
allocator<T> _allocator;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}
このコードをコメント側に変更してコンパイルするとこけるんだけど、なんで?
931デフォルトの名無しさん
2021/11/07(日) 17:51:19.26ID:ISiN+sDp >>928
aggregate限定だね
aggregate限定だね
932デフォルトの名無しさん
2021/11/07(日) 17:56:01.13ID:Mdbpk+F7 >>930
https://en.cppreference.com/w/cpp/named_req/Allocator#cite_note-2
> rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args>, where Args is zero or more additional template type parameters.
これですかね?
カスタムアロケータ自分で定義したことないのでじゃあどうすればいいかは分かりませんが……
https://en.cppreference.com/w/cpp/named_req/Allocator#cite_note-2
> rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args>, where Args is zero or more additional template type parameters.
これですかね?
カスタムアロケータ自分で定義したことないのでじゃあどうすればいいかは分かりませんが……
933デフォルトの名無しさん
2021/11/07(日) 18:53:11.25ID:Qwz9shRh rebind_allocが悪さしてたりして
934デフォルトの名無しさん
2021/11/07(日) 19:23:12.01ID:A2QjBZsT >>930
SizeLimitedAllocatorの定義にこれ追加すればいいよ
template<typename U>
struct rebind {using other = SizeLimitedAllocator<U,C>;};
SizeLimitedAllocatorの定義にこれ追加すればいいよ
template<typename U>
struct rebind {using other = SizeLimitedAllocator<U,C>;};
935デフォルトの名無しさん
2021/11/08(月) 00:05:22.17ID:dWDs4ee0 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/ptr_traits.h#L62-L69
この辺の定義にある
定数値という型でないものがテンプレート引数に入ったため、__replace_first_argの下側の定義が使われず
上側の定義が使用されtypeも入らず
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L80
でrebindできなくなったことが原因でした。
これを回避するためには、>>934のように
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L51-L57
この下の定義に当てはまるrebind<U>::otherを定義しておく必要があるようです。
定数値でなく型がテンプレート引数に追加された場合は、otherの定義は必要ありませんでした。
この辺の定義にある
定数値という型でないものがテンプレート引数に入ったため、__replace_first_argの下側の定義が使われず
上側の定義が使用されtypeも入らず
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L80
でrebindできなくなったことが原因でした。
これを回避するためには、>>934のように
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L51-L57
この下の定義に当てはまるrebind<U>::otherを定義しておく必要があるようです。
定数値でなく型がテンプレート引数に追加された場合は、otherの定義は必要ありませんでした。
936デフォルトの名無しさん
2021/11/10(水) 17:04:45.91ID:9a0GsOuO グーグルテストのASSERTの片辺に期待値をマジックナンバーじゃなくマクロ定数で指定すると赤線引いて来やがるんだけどVSだけ?
ビルドは通るしテストもできるから全く問題ないんだけどうぜー
ビルドは通るしテストもできるから全く問題ないんだけどうぜー
937デフォルトの名無しさん
2021/11/10(水) 20:17:21.11ID:MFJzciMu warningの種類ごとにon/offしたくなる
938デフォルトの名無しさん
2021/11/11(木) 00:05:50.61ID:QjSth2/F 大体のコンパイラはそういう#pragma持ってるだろ
MSVCなら#pragma warning
GCCなら#pragma GCC diagnostic
MSVCなら#pragma warning
GCCなら#pragma GCC diagnostic
939デフォルトの名無しさん
2021/11/12(金) 12:50:12.26ID:DicJ24/v 改行コードとかタブコードとかが含まれた文字列を
\nとか\tとかにエスケープしてくれる関数ってある?
\nとか\tとかにエスケープしてくれる関数ってある?
940デフォルトの名無しさん
2021/11/12(金) 12:53:25.82ID:/M/iq88E 速度気にしないなら正規表現で
941デフォルトの名無しさん
2021/11/12(金) 13:28:00.04ID:INEjO2I3 quote?
942デフォルトの名無しさん
2021/11/12(金) 14:16:51.83ID:IjXGHyKg std::replaceは?
sjisだとまずいかも
sjisだとまずいかも
943デフォルトの名無しさん
2021/11/12(金) 20:51:39.15ID:4Xte/kSq 文字コード周りはカオスすぎて標準も手に負えず匙投げたからライブラリ使った方がいいよ
944デフォルトの名無しさん
2021/11/12(金) 23:22:09.10ID:qmhW9zZv >>939
C/C++の場合、1文字単位での文字列処理が得意なので、自作するのも簡単。
0x09 や 0x0a は、SJISやUtf8などの多バイト文字の中には含まれて無いから、
なおさら。
例えば、std::stringでも、新しい文字列変数dstを作って、srcの文字列
から1バイト単位で読み取って、dstに1文字ずつ末尾追加していけばいい。
C/C++の場合、1文字単位での文字列処理が得意なので、自作するのも簡単。
0x09 や 0x0a は、SJISやUtf8などの多バイト文字の中には含まれて無いから、
なおさら。
例えば、std::stringでも、新しい文字列変数dstを作って、srcの文字列
から1バイト単位で読み取って、dstに1文字ずつ末尾追加していけばいい。
945デフォルトの名無しさん
2021/11/12(金) 23:28:15.13ID:qmhW9zZv >>944
[具体例]
MFCのCStringなら、以下のようにするだけでよい:
CString src = "元の文字列";
CString dst; // 変換後の文字列を入れる変数。
const char *ptr = (const char *)src; // CString の 0 終端文字列の先頭アドレスを取得するための変換関数を呼び出している。
while ( *ptr != 0 ) {
if ( *ptr == 0x0a ) {
dst += "\\n";
}
else if ( *ptr == 0x09 ) {
dst += "\\t";
}
else {
dst += *ptr;
}
ptr++;
}
[具体例]
MFCのCStringなら、以下のようにするだけでよい:
CString src = "元の文字列";
CString dst; // 変換後の文字列を入れる変数。
const char *ptr = (const char *)src; // CString の 0 終端文字列の先頭アドレスを取得するための変換関数を呼び出している。
while ( *ptr != 0 ) {
if ( *ptr == 0x0a ) {
dst += "\\n";
}
else if ( *ptr == 0x09 ) {
dst += "\\t";
}
else {
dst += *ptr;
}
ptr++;
}
946デフォルトの名無しさん
2021/11/12(金) 23:33:56.40ID:qmhW9zZv >>945
[補足]
このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、
無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。
後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、
1バイトずつ処理され、2回ループが回るが、問題ない。
UTF8だと3回ループされる。
つまり、このプログラムでは、SJISの1文字は、2文字のように
UTF8の"あ"の文字は、3文字のように処理される。
しかし、それでも結果的には問題ない。
なぜなら、0x0aや0x09は、多バイト文字の中には含まれてないから。
ただし、SJISの場合、\ の文字コードが含まれているので注意が必要ではあるが、
今回は問題ない。
[補足]
このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、
無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。
後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、
1バイトずつ処理され、2回ループが回るが、問題ない。
UTF8だと3回ループされる。
つまり、このプログラムでは、SJISの1文字は、2文字のように
UTF8の"あ"の文字は、3文字のように処理される。
しかし、それでも結果的には問題ない。
なぜなら、0x0aや0x09は、多バイト文字の中には含まれてないから。
ただし、SJISの場合、\ の文字コードが含まれているので注意が必要ではあるが、
今回は問題ない。
947デフォルトの名無しさん
2021/11/12(金) 23:39:04.51ID:qmhW9zZv >>946
[補足2]
char は、C言語が登場した時には、「文字」の意味であったが、
今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。
そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視
してよい。
Javaなどでは、charが 必ず16BITであるのとは対照的である。
ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって
本当の1文字には対応していない。
※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
[補足2]
char は、C言語が登場した時には、「文字」の意味であったが、
今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。
そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視
してよい。
Javaなどでは、charが 必ず16BITであるのとは対照的である。
ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって
本当の1文字には対応していない。
※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
948デフォルトの名無しさん
2021/11/13(土) 02:30:33.64ID:sxA0duhG メモリ確保が多発しそうなプログラムやね
949デフォルトの名無しさん
2021/11/13(土) 06:30:48.47ID:x1CN7sQN 老害が一生懸命考えたんだろw
メモリリークしまくられるよりマシ
メモリリークしまくられるよりマシ
950デフォルトの名無しさん
2021/11/13(土) 07:45:14.90ID:xg91cK1y CStringにせよbasic_stringにせよメモリ確保の多発なんて心配しなくていいよ
JavaのStringじゃないんだから
JavaのStringじゃないんだから
951デフォルトの名無しさん
2021/11/13(土) 08:44:09.90ID:sxA0duhG こういう時reserveしてなくても問題ないの?
最大容量わかってるやん。
最大容量わかってるやん。
952デフォルトの名無しさん
2021/11/13(土) 09:34:35.76ID:GqP7nzeW メモリ2倍取るのと再配置とどっちが無駄かはそれこそ環境と目的次第だろ
953デフォルトの名無しさん
2021/11/13(土) 11:06:02.43ID:wYZH/w0f954デフォルトの名無しさん
2021/11/13(土) 11:44:37.82ID:wZp5djKL vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、
たいていの場合はreserveしようがしまいが有意な差は出ないよね
たいていの場合はreserveしようがしまいが有意な差は出ないよね
955デフォルトの名無しさん
2021/11/13(土) 12:34:40.00ID:GR8tTV2x956デフォルトの名無しさん
2021/11/13(土) 12:36:34.59ID:GR8tTV2x >>944-945
良い子は真似をしないように
良い子は真似をしないように
957デフォルトの名無しさん
2021/11/13(土) 12:49:12.18ID:jQtDYU1M プログラミングとしてはiso2020使ってた頃と大して変わらんよね
低レベルで吸収してくれんとやってられん
低レベルで吸収してくれんとやってられん
958デフォルトの名無しさん
2021/11/13(土) 13:24:23.81ID:xg91cK1y ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから
プログラマ側ががんばってバッファリングしても二度手間だったりする
プログラマ側ががんばってバッファリングしても二度手間だったりする
959ハノン ◆QZaw55cn4c
2021/11/13(土) 15:53:45.28ID:DyUYxUU0961デフォルトの名無しさん
2021/11/13(土) 17:16:26.07ID:kpA91CRo 文字コードなんて事実上iconvが標準だろ
せいぜいicuくらい
他は一部のプラットフォーム固有の関数くらい
制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな
真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw
ってわけでC++とか関係ない話だからどうでもいいよ
せいぜいicuくらい
他は一部のプラットフォーム固有の関数くらい
制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな
真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw
ってわけでC++とか関係ない話だからどうでもいいよ
962デフォルトの名無しさん
2021/11/13(土) 18:02:09.89ID:vJfZgOKN C++ なら strstream やろ
963デフォルトの名無しさん
2021/11/13(土) 18:03:36.59ID:vJfZgOKN965デフォルトの名無しさん
2021/11/13(土) 19:29:59.64ID:vJfZgOKN966デフォルトの名無しさん
2021/11/13(土) 21:14:20.03ID:aIrFEHKz 自分はHTML5の仕様に従って変換してます!
967デフォルトの名無しさん
2021/11/14(日) 08:24:14.02ID:gLhea8X6 >>959
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、
何使ってもUnicodeは闇じゃないか。
まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、
何使ってもUnicodeは闇じゃないか。
まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
968デフォルトの名無しさん
2021/11/14(日) 09:14:46.42ID:ybz8bu8o この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
969デフォルトの名無しさん
2021/11/14(日) 10:38:12.94ID:G9ajtZXw >>948
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、
同じようなアルゴリズムを使ってるはずだから、これが
特に非効率なわけではないし、代わりになるアルゴリズムで
これよりトータルで効率の良いものも恐らく存在しない。
1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な
dstのバイト数を見積もることは可能だが、その場合は、
二回もパースが必要になるし、プログラムも分かりにくくなる。
二回パースすることによる速度低下も有る。
2.dstのサイズはsrcのサイズの2倍を越えないので、単純に
dstの内部バッファをsrcのバイト数の2倍として予約しておけば
メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、
余り良いアルゴリズムとは言えない。
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、
同じようなアルゴリズムを使ってるはずだから、これが
特に非効率なわけではないし、代わりになるアルゴリズムで
これよりトータルで効率の良いものも恐らく存在しない。
1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な
dstのバイト数を見積もることは可能だが、その場合は、
二回もパースが必要になるし、プログラムも分かりにくくなる。
二回パースすることによる速度低下も有る。
2.dstのサイズはsrcのサイズの2倍を越えないので、単純に
dstの内部バッファをsrcのバイト数の2倍として予約しておけば
メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、
余り良いアルゴリズムとは言えない。
970デフォルトの名無しさん
2021/11/14(日) 10:52:13.79ID:G9ajtZXw >>951
文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので
確保される回数は、最終的な文字列のバイト数を N としたとき、大体、
log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、
b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k
k = log2(N) 程度
a = 文字列クラスの内部バッファの初期バイト数。
となり、大体で言えば、2N を越えない。
1 + 2 + 2^2 + 2^3 + ... + 2^k
は 2進数で考えれば、全てのビットが 1 に成っている整数で、
2^{k+1} = 2*2^k = 2*2^{log2(N)} = 2 * N
であることに注意する。
ただし、bの値は大体で書いたので、厳密には少し違うだろう。
文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので
確保される回数は、最終的な文字列のバイト数を N としたとき、大体、
log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、
b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k
k = log2(N) 程度
a = 文字列クラスの内部バッファの初期バイト数。
となり、大体で言えば、2N を越えない。
1 + 2 + 2^2 + 2^3 + ... + 2^k
は 2進数で考えれば、全てのビットが 1 に成っている整数で、
2^{k+1} = 2*2^k = 2*2^{log2(N)} = 2 * N
であることに注意する。
ただし、bの値は大体で書いたので、厳密には少し違うだろう。
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 中国外務省局長 「ポケットに手を入れていたのは寒いから」 日本との局長級会談で ★2 [お断り★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★7 [ぐれ★]
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 ★3 [お断り★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 【実況】博衣こよりのえちえちフログロ学力テスト🧪★5
- エッヂ落ちた?
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 中国発の日本行きチケット、50万枚キャンセルwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww✈ [329329848]
- 【ぺこ専🐰】なんG 兎田ぺこら実況スレ🏡【ホロライブ▶】
- 【街の声】高市人気爆発!野党に怒りの声!! [237216734]
