【C++】STL(Standard Template Library)相談室 9
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/02/27(水) 02:03:30前スレ
【C++】STL(Standard Template Library)相談室 8
http://pc11.2ch.net/test/read.cgi/tech/1198435319/
過去ログ・リンク・書籍紹介は >>2 以降
0002デフォルトの名無しさん
2008/02/27(水) 02:05:01http://pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
http://pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0003デフォルトの名無しさん
2008/02/27(水) 02:05:31・入門
http://www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
・TIPS集
http://www.nantekotta.com/stl.html
・メルマガ
http://www.kab-studio.biz/Programing/STLiostream/
・解説
http://ja.wikipedia.org/wiki/Standard_Template_Library
http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html
マルチスレッドプログラミングの時には
http://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html
STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/
0004デフォルトの名無しさん
2008/02/27(水) 02:05:53STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
http://www.amazon.co.jp/gp/product/4881357786/
STL―標準テンプレートライブラリによるC++プログラミング 第2版
http://www.amazon.co.jp/gp/product/4894714329/
標準C++:STLの基礎知識
http://www.amazon.co.jp/gp/product/4756138047/
標準講座C++―基礎からSTLを利用したプログラミングまで
http://www.amazon.co.jp/gp/product/4881357050/
STLによるコンポーネントデザイン
http://www.amazon.co.jp/gp/product/475613422X/
Effective STL―STLを効果的に使いこなす50の鉄則
http://www.amazon.co.jp/gp/product/4894714108/
0005デフォルトの名無しさん
2008/02/27(水) 02:07:07C++相談室 part60
http://pc11.2ch.net/test/read.cgi/tech/1200044614/
Boostを語れゴラァ part5
http://pc11.2ch.net/test/read.cgi/tech/1192662575/
C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
C++0x Part2
http://pc11.2ch.net/test/read.cgi/tech/1191754720/
0006デフォルトの名無しさん
2008/02/27(水) 02:07:360007デフォルトの名無しさん
2008/02/27(水) 09:50:040008デフォルトの名無しさん
2008/02/27(水) 10:31:03乙< >>1 > >>1乙;
0009デフォルトの名無しさん
2008/02/27(水) 12:04:36typedef vector<int>::const_iterator CIT;
for(CIT i = v.begin(); i != v.end(); ++i) {
//...............
}
こんなことしなくて良いなんてよぉ〜
for(auto i = v.begin(); i != v.end(); ++i) {
//...............
}
素晴らしいじゃんかよぉ〜 禿考えたのぉ〜
0010デフォルトの名無しさん
2008/02/27(水) 12:39:20for (auto<int> i = v.begin(); i < v.end(); ++i)
autoの癖にint宣言が必要だから駄目か
という以前に(ry
0011デフォルトの名無しさん
2008/02/27(水) 19:30:39にはならないのか
0012デフォルトの名無しさん
2008/02/27(水) 19:34:300013デフォルトの名無しさん
2008/02/27(水) 20:29:12今は頑張ってもBOOST_FOREACH(i, v);か
0014デフォルトの名無しさん
2008/02/27(水) 22:13:19この調子でどんどん奇怪な言語に仕上げてくれ。
0015デフォルトの名無しさん
2008/02/27(水) 22:20:530016デフォルトの名無しさん
2008/02/27(水) 22:23:480017デフォルトの名無しさん
2008/02/27(水) 22:35:090018デフォルトの名無しさん
2008/02/27(水) 22:37:25std::vector<int> vec = { 1, 2, 3 };
for ( auto i; vec ) {
std::cout << i << std::endl;
}
0019デフォルトの名無しさん
2008/02/27(水) 22:42:06検討されてはいたはず。
0020デフォルトの名無しさん
2008/02/27(水) 22:58:43for i ( 10, 15, 23, 8, 6 ) {
cout << i << endl;
}
みたいなことを凄くやりたくなる
0021デフォルトの名無しさん
2008/02/27(水) 23:19:46C++コンパイラはLispで実装されてるんですよ
0022デフォルトの名無しさん
2008/02/27(水) 23:22:260023デフォルトの名無しさん
2008/02/27(水) 23:27:40http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2385.pdf
によれば
for ( auto i.; { 10, 15, 23, 8, 6 } ) {
cout << i << endl;
}
はできるような気がする。
002420
2008/02/28(木) 00:24:53/. : : : : : : : : :: \
/.: : : : : : : : : : : : : : ヽ
,!::: : : : : :,-…-…-ミ: : :', マジかよ
{:: : : : :: : :i '⌒' '⌒'i: : :}
{:: : : : : : | ェェ ェェ | : :} ∩___∩
{ : : : : : :| ,.、 |: :;! / >>23 ヽ
__ヾ: : : :: :i r‐-ニ-┐| :ノ | ● ● |
ゞ : :イ! ヽ 二゙ノイ‐′ | ( _●_) ミ
` ー一'´ヽ \ ,,-''"彡 |∪| __/`''--、
) |@ |ヽ/ ヽノ ̄ ヽ
| | ノ / ⊂) メ ヽ_,,,---
| .|@ | |_ノ ,へ / ヽ ヽノ ̄
| |_ / / | / | | ヽ_,,-''"
__|_ \\,,-'"\__/ / ,────''''''''''''''"""""""
~フ⌒ ̄ ̄ ~ヽ ヽ  ̄ ̄"""'''''''--、""''''---,,,,,,__
/  ̄''、|ノ )ヽ
___/  ̄ ̄) / |___
0025デフォルトの名無しさん
2008/02/28(木) 00:42:49--、 _____ -丶
|;;;/::::::::::::::::::::::::::::::/ |
// ̄,'' ̄ ̄\:::::::'''',,,丿
/-=・=- -=・=- _|:::::::::::::\
/ゝ ▼ <:::::::::::::::<:::: ̄--_
---┼/ 、 -─-\--<::::::::::::::::::::-_ ふーん
--─\ ⌒  ̄ ̄ ̄ゝ::::::::::::::::::::::::::::::::::::::::-_
\__ ゝ/::::::::::::::::::::::::::::::;;;;;;;;;;;::::::::::::\
,,ノ 丿:::::::::::::::::::::::::/:::::::::::::::::::::::::::::::::::|
> /:::::::::::::::::|::/::::::::::::::::::::::::::::::::::::::::::::|
>.,. /::::::::::::::::::ノ;;/:::::::::::::::::::::::::::::::::::::::::::::::::| ____________
/:::::::::::::::::::ノ;;;;|::::::::::::::::::::::::::::::::::::::::::::::::::::|__-||||||::::||||||::::||||\
/::::::::::::::::::/;;;;;;;|:::::::::::::::::::::::::::::::::::::::::::::::::::::|::::|||||||:::||||||:::||||||::::::
(!!!!!!(:::::::::::::::/ ;;;;;;;;;;;;|::::::::::::::::::::::::::::::::::::::::::::::::::::/::::|||||||:::||||||:::|||||||::ノ
(!!!!!!!!!!!!!ノ (lllllllllllゝ:::::::::::::::::::::::::::::::::::::::/-- ̄  ̄
,,,,ヽ::::::::-ゝ:::::::::::/
(!!!!!!!!!!!!!!!!!!!!ノ
0026デフォルトの名無しさん
2008/02/28(木) 11:24:33LoadFromStream/Save〜、
みたいな入出力は、
STLではどうなっていますか?
0027デフォルトの名無しさん
2008/02/28(木) 11:25:45002826
2008/02/28(木) 11:35:28メモリプールはどんな感じで実装すれば良いのでしょう?
fstreamで読みながら、メモリサイズを増やすと、劇遅な機ガスので。
0029デフォルトの名無しさん
2008/02/28(木) 11:38:38いきなりメモリプールって言われても何のことだかわからん。
読みながら増やすのが嫌なら読む前にファイルサイズで確保すれば
「プール」とか要らんだろ。
0030デフォルトの名無しさん
2008/02/28(木) 11:41:46効率的なプールはどうやったら作れますか?
0031デフォルトの名無しさん
2008/02/28(木) 12:27:52サイズが分からないという前提なら、読みながらメモリ確保が必須なのはしょうがないだろ。
「効率的な」というのが「読みながらメモリ確保しない」という意味でないのなら、説明して
もらわないとわからん。
0032デフォルトの名無しさん
2008/02/28(木) 12:51:08漠然とし過ぎていてなんとも。メモリプールを最適化するのに実測なし
で議論するのは簡単ではないと思う。
0033デフォルトの名無しさん
2008/02/28(木) 12:54:510034デフォルトの名無しさん
2008/02/28(木) 12:58:18コンテナだろ?そりゃそうだ。
0035デフォルトの名無しさん
2008/02/28(木) 13:00:23LoadFromFile/Save〜、
LoadFromStream/Save〜、
がある、
メモリプールの実装教えれ!
0036デフォルトの名無しさん
2008/02/28(木) 13:02:11ぶん ぶん ぶん ハチが飛ぶ
0037デフォルトの名無しさん
2008/02/28(木) 13:11:28ありません。さようなら。
0038デフォルトの名無しさん
2008/02/28(木) 13:15:09↓
#include <vector>
#include <map>
#include <string>
#include <istream>
#include <iterator>
#include <fstream>
#include <cstddef>
#include <exception>
#include <iostream>
typedef std::vector<char> memory_type;
class pocket {
std::map<std::string, memory_type> naka;
public:
void ireru(std::string const& filename) {
std::ifstream file(filename.c_str());
file.exceptions(std::ios::badbit | std::ios::failbit);
naka[filename].assign(std::istreambuf_iterator<char>(file)
, std::istreambuf_iterator<char>());
}
};
int main(int argc, char* argv[]) {
try {
pocket pocket;
for (int i = 1; i < argc; ++i) { pocket.ireru(argv[i]); }
return EXIT_SUCCESS;
}
catch (std::exception const& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE;
}
}
0039デフォルトの名無しさん
2008/02/28(木) 13:18:520040デフォルトの名無しさん
2008/02/28(木) 13:21:34範囲指定イテレータのassignだよ。vector, deque, list, stringにある。
void container_type::assign(InputIterator b, InputIterator e);
0041デフォルトの名無しさん
2008/02/28(木) 13:22:41ttp://ml.tietew.jp/cppll/cppll/thread_articles/3804
>stringのコンストラクタはiteratorを取れるんですね。
>ifstream fs(path);
>s= string((istreambuf_iterator<char>(fs)),
>istreambuf_iterator<char>());
1行でLoadは分かりましたが、逆に対になる1行でSaveするにはどうすれば良いでしょう?
004241
2008/02/28(木) 13:24:42バイナリファイルだとどうなりますか?
0043デフォルトの名無しさん
2008/02/28(木) 13:39:260044デフォルトの名無しさん
2008/02/28(木) 13:48:55string s("unko benki");
ofstream ofs("koumon.txt");
copy(s.begin(), s.end(), ostreambuf_iterator<char>(ofs));
0045デフォルトの名無しさん
2008/02/28(木) 13:52:12>ostreambuf_iterator
の使い方サンks。
次バイナリファイルの場合キボン。
これが分かれば、LoadFromFile/SaveFromFileメソッドを実装して、今日は定時でさっさと帰ります。
0046デフォルトの名無しさん
2008/02/28(木) 13:53:56istreambuf_iteratorはバイナリ入力(sgetc, sbumpc)なんだが。
0047デフォルトの名無しさん
2008/02/28(木) 13:57:30ostreambuf_iteratorはバイナリ出力(sputc)なんだが。
詳しくは、ストリームバッファクラス。
0048デフォルトの名無しさん
2008/02/28(木) 13:58:48なるほど、
vector<char> Memだったとして、
ファイルストリームfsを作って、
のistreambuf_iteratorをfsから作って、
Memに代入すれば良いのですね?
ってイマイチ書き方が分からない。
コンパイラに相談しながら書いてみます。
イテレーターって難い。
0049デフォルトの名無しさん
2008/02/28(木) 14:00:01>ストリームバッファクラス
あ、これ未調査だった。
やっぱ、ストリームの基底クラスがあるんだね。
それが分かれば分かる筈。
0050デフォルトの名無しさん
2008/02/28(木) 14:03:23ストリームクラスの基底クラスではない。
継承関係にはない。
ストリームバッファクラス(basic_streambuf<>)のオブジェクトへの
ポインタを保持している。
0051デフォルトの名無しさん
2008/02/28(木) 14:29:38//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
//stringからバッファへロード
}
//---------------------------------------------------------------------------
bool Test::SaveToFile(const char *filepath)
{
string SBuf(Text());
//バッファからstringへセーブ
ofstream fs(filepath);
copy(SBuf.begin(), SBuf.end(), ostreambuf_iterator<char>(fs));
}
//---------------------------------------------------------------------------
0052デフォルトの名無しさん
2008/02/28(木) 14:52:45ファイルのオープンに成功したかどうかは
チェックせんの?
0053デフォルトの名無しさん
2008/02/28(木) 15:02:080054デフォルトの名無しさん
2008/02/28(木) 15:05:56//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
if (!fs.is_open()) return false;
//stringからバッファへロード
if (fs.bad()) return false;
if (fs.fail()) return false;
return true;
}
//---------------------------------------------------------------------------
0055デフォルトの名無しさん
2008/02/28(木) 15:06:46//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
if (!fs.is_open()) return false;
if (fs.bad()) return false;
if (fs.fail()) return false;
//stringからバッファへロード
return true;
}
//---------------------------------------------------------------------------
0056デフォルトの名無しさん
2008/02/28(木) 15:10:29コード読んでるこっちが恥ずかしくなるわ
0057デフォルトの名無しさん
2008/02/28(木) 15:10:42でいいだろ
0058デフォルトの名無しさん
2008/02/28(木) 15:14:02//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
if (!fs) return false;
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
if (fs.bad()) return false;
if (fs.fail()) return false;
//stringからバッファへロード
return true;
}
//---------------------------------------------------------------------------
0059デフォルトの名無しさん
2008/02/28(木) 15:30:28既に、
>vector<char> Memory
ってのが存在していた場合は、
上の書き方のままだったらロードするときのメモリは別にとって、次に、Memoryにコピーしなきゃならないのでしょうか?
それだと、メモリ2倍で勿体ないような。
0060デフォルトの名無しさん
2008/02/28(木) 15:41:00vectorに読み込みたいのか?
ならvectorにも同様のコンストラクタがある。
006159
2008/02/28(木) 15:48:05もしかして、
>vector::swap
でおk?
0062デフォルトの名無しさん
2008/02/28(木) 15:55:06assign では駄目なのか?
なんか基本があやしいふいんきだから
Accelerated C++ くらいは目を通した方がいいと思うんだが。
0063デフォルトの名無しさん
2008/02/28(木) 16:02:10Memory.assign((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
vector<char>(Memory).swap(Memory);
006459
2008/02/28(木) 16:05:38ふいんきでヴぁれました?
>>63
回答サンks。
上の1行で良いように見えますが、上下2行でセットですか?
まずは、assignぐぐってみまつ。
0065デフォルトの名無しさん
2008/02/28(木) 16:11:15ttp://etwas.wolfish.org/diary/2007/02/28/2007022801/
0066デフォルトの名無しさん
2008/02/28(木) 16:58:380067デフォルトの名無しさん
2008/02/28(木) 17:04:43おまえ C++Builderスレでも同じ様なこと書いてる奴だろ?
0068デフォルトの名無しさん
2008/02/28(木) 17:04:59//---------------------------------------------------------------------------
クラスヘッダー: std::vector<char> Memory;
//---------------------------------------------------------------------------
bool Bin::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath, std::ios::in | std::ios::binary);
if (!fs) return false;
fs.seekg(0, std::ifstream::end);
Memory.resize(fs.tellg());
fs.seekg(0, std::istream::beg);
if (fs.bad()) return false;
if (fs.fail()) return false;
fs.read(&Memory[0], Memory.size());
fs.close();
return true;
}
//---------------------------------------------------------------------------
bool Bin::SaveToFile(const char *filepath)
{
ofstream fs(filepath, std::ios::out | std::ios::binary);
if (!fs) return false;
copy(Memory.begin(), Memory.end(), ostreambuf_iterator<char>(fs));
if (fs.bad()) return false;
if (fs.fail()) return false;
return true;
}
//---------------------------------------------------------------------------
0070デフォルトの名無しさん
2008/02/28(木) 17:12:44うんこブリブリブリーーーーーーーーーーーーー
0071デフォルトの名無しさん
2008/02/28(木) 18:11:16いや、それじゃねえな。 偶々std::を使ったレスを持ち出して、 話のはぐらかしか?
0072デフォルトの名無しさん
2008/02/28(木) 18:19:14ttp://articles.blog79.fc2.com/blog-date-200610.html
>std::stringの大文字/小文字変換
>通常は上記の書き方で問題ありませんが、これがコンパイルエラーとなる場合があります。
についてkwskキボンorz
0073デフォルトの名無しさん
2008/02/28(木) 18:24:42解説文も解読できないんならおまえ向いてないよ。 工場のライン工やっとけ
0074デフォルトの名無しさん
2008/02/28(木) 18:30:01C++って学校の宿題スレなかったっけ?
0075デフォルトの名無しさん
2008/02/28(木) 18:31:09>int tolower(int);
> std::transform(str.begin(),str.end(),str.begin(),toupper);
>: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'
これでもエラー出るんですよねorz
0076デフォルトの名無しさん
2008/02/28(木) 18:34:38> (int (*)(int))std::toupper
に直してませんですたorz
0077デフォルトの名無しさん
2008/02/28(木) 20:57:330078デフォルトの名無しさん
2008/02/28(木) 22:13:46違う。localeを引数に取る多重定義があって、それと曖昧と言われてしまうため。
0079デフォルトの名無しさん
2008/02/28(木) 23:29:510080デフォルトの名無しさん
2008/02/29(金) 05:46:31このようにmapに自分と同じ型を含めたい場合は、どう書くのがスタンダードでしょうか?
今はnewで確保して入れて、(MyMAP*)にキャストして使用&deleteしてるんですが。
0081デフォルトの名無しさん
2008/02/29(金) 09:43:26typedef だと無理っぽいねぇ。 class で囲ってやるか、意味的に奇怪だけど継承するとか。
struct MyMap : std::map<char, MyMap*> {};
0082デフォルトの名無しさん
2008/02/29(金) 10:15:180083デフォルトの名無しさん
2008/02/29(金) 10:32:04>struct MyMap : std::map<char, MyMap*> {};
そんな事ができるとは思いもしなかった
0084デフォルトの名無しさん
2008/02/29(金) 10:42:27できない理由が無ければできるもんだよ。
0085デフォルトの名無しさん
2008/02/29(金) 11:08:07STLってできあがるものってクラスなんだね。
0086デフォルトの名無しさん
2008/02/29(金) 11:14:36いいえ。コンテナだけがSTLではありません。
0087デフォルトの名無しさん
2008/02/29(金) 11:17:57STL = コンテナ ∩ イテレーター ∩ ?
0088デフォルトの名無しさん
2008/02/29(金) 11:23:470089デフォルトの名無しさん
2008/02/29(金) 11:25:34こういうのって何て呼ぶんだ?
インライン関数群?
0090デフォルトの名無しさん
2008/02/29(金) 11:45:020091デフォルトの名無しさん
2008/02/29(金) 11:51:26インクルードファイルalgorithmやnumericで定義されている関数
>>90
日本人だからでしょ
0092デフォルトの名無しさん
2008/02/29(金) 12:09:350093デフォルトの名無しさん
2008/02/29(金) 12:52:100094デフォルトの名無しさん
2008/02/29(金) 15:59:450095デフォルトの名無しさん
2008/02/29(金) 17:22:11ことによると中国人かも
0096デフォルトの名無しさん
2008/02/29(金) 17:56:00神の教えだからだろ
0097デフォルトの名無しさん
2008/02/29(金) 18:34:41ここから拡張子だけを抽出したい場合、定番の方法などあるのでしょうか?
0098デフォルトの名無しさん
2008/02/29(金) 18:50:10まあ c_str と _splitpath() のほうが面倒が少ないと思うけど。
0099デフォルトの名無しさん
2008/03/01(土) 13:02:130100デフォルトの名無しさん
2008/03/03(月) 16:27:08std::stringにファイル名が入ってるなら
そのファイル名が入ってるstd::string型のオブジェクト名
がfilenameという名前とすると
char *fname = filename.c_str();
てな感じでchar *型で受け取り
#include <cstring>をインクルードしておき
char *piliod = strrchr(fname,'.');
で拡張子の手前のピリオド位置を取得し
piliod++;ってすれば拡張子名だけchar *型で取得できる
これらの操作をwchar_t用の関数に変更すれば
wchar_t *型で拡張子名を取得できる
まぁ、STL板だしstd::wstringを操作するとしたなら
素直にクラスのfind_last_of使って
sizetype pos = filename.find_last_of(L'.')てな感じで
けつからピリオドの位置見つけてpos++;して
std::wstring fextenshion =filename.substr(pos)とすれば
拡張子だけ手に入る
0101デフォルトの名無しさん
2008/03/03(月) 18:54:54ちまちま書くよりc_strでランタイムやAPIの既存のルーチンに任せるのが定番。
0102デフォルトの名無しさん
2008/03/03(月) 18:57:590103デフォルトの名無しさん
2008/03/06(木) 14:54:51から、
>std::string SBuf;
にデータを移すにはどう記述したら良いですか?
SBuf = resultBuf;
とするとコンパイルエラーです。
インテリセンスの無い環境でやっててつらいです。
0104デフォルトの名無しさん
2008/03/06(木) 15:12:55char *fname = filename.c_str();
これは、不味いんじゃないのか?
0105デフォルトの名無しさん
2008/03/06(木) 15:15:26SBuf = &resultBuf[0];
0106103
2008/03/06(木) 15:20:33有難うございます。コンパイル通りました。
ついでですが、resutlBufにNULLが入ってる場合、どう書けば良いですか?
今回不要なんですが。
memcpy使うのもC言語っぽいしぃ。
0107デフォルトの名無しさん
2008/03/06(木) 15:21:39または、
SBuf.assign(resultBuf.begin(), resultBuf.end());
resultBufがnull終端なら>>105でもいい
0108デフォルトの名無しさん
2008/03/06(木) 15:24:40stringの内部バッファの連続性はまだ保証されてない気がしたが。
0109デフォルトの名無しさん
2008/03/06(木) 15:27:58それは関係ないだろ
string s = "foo";
とかやるのと一緒
0110デフォルトの名無しさん
2008/03/06(木) 15:31:41resultBufは、char型のvector
vectorはバッファの連続性を保証されているから無問題
問題があるとすれば、>>107の指摘の様にnull終端では無い場合
0111103
2008/03/06(木) 15:42:13ありがとうございましたorz
0112デフォルトの名無しさん
2008/03/06(木) 15:52:55それよりも、>>104の指摘している
>>100
char *fname = filename.c_str();
の方がやばいんじゃない?
*fnameの代入が終了したら、c_str()の戻したポインタの有効期限が切れているから
char *piliod = strrchr(fname,'.');
の処理をするときには、何が起こるのか判らない状態になっていると思うんだけど
0113デフォルトの名無しさん
2008/03/06(木) 16:06:11filename.c_str()で返るポインタは、filenameの非constメンバ関数が呼ばれるまで有効
0114デフォルトの名無しさん
2008/03/06(木) 16:27:450115デフォルトの名無しさん
2008/03/06(木) 16:31:540116デフォルトの名無しさん
2008/03/06(木) 16:43:22お前そんなプログラム書いてるのか。お前には仕事を任せられんな。
0117デフォルトの名無しさん
2008/03/06(木) 16:44:44まじ?
ゴミになったのに、ゴミになったって気が付いてないとかそう言う問題の気がするが...
lstrcpy(buf, str.c_str());
これは怖くないが
char *word = str.c_str();
lstrcpy(buf, word);
これは、いつ見ても、ヤバイ香りがするんだ
関数の返すポインタには何度も煮え湯を飲まされたし...orz
0118デフォルトの名無しさん
2008/03/06(木) 16:52:12>>117
>>113 is right.
About c_str()
The return value is valid only as long as the string exists, and as long as only
constant functions are called for it.
0119デフォルトの名無しさん
2008/03/06(木) 16:53:25言い訳はいいからお前には仕事はやらん。
0120デフォルトの名無しさん
2008/03/06(木) 16:54:49お前のレスだけ明後日の方向むいててワラタ
0121デフォルトの名無しさん
2008/03/06(木) 16:56:16「そんなプログラム」ってどんなプログラム?
>>113はプログラムの書き方なんか一言も触れてないよね。
c_str()の戻り値の寿命についての情報を書いてるだけ。
「そんなプログラム」ってどんなプログラム?
それは113のどこに書いてあるの? 教えて。
0122デフォルトの名無しさん
2008/03/06(木) 17:05:37びびりまくりでワロタw
0123デフォルトの名無しさん
2008/03/06(木) 17:08:150124デフォルトの名無しさん
2008/03/06(木) 17:09:05見よう見まねや雑談で得た俺仕様を根拠にして、正しい仕様に基づく使い方を攻撃するのは
みっともないと思う。
0125デフォルトの名無しさん
2008/03/06(木) 17:10:03なんて心配をするようなら、116の言うことだって分からなくもない。
0126デフォルトの名無しさん
2008/03/06(木) 17:11:55>lstrcpy(buf, str.c_str());
これと
>char *word = str.c_str();
>lstrcpy(buf, word);
これで振る舞いが異るようにc_strを実装する方法は存在しないだろ
0127デフォルトの名無しさん
2008/03/06(木) 17:11:59>関数の返すポインタには何度も煮え湯を飲まされたし...orz
仕様を確認せずに「香り」でコード書くから何度もそういうミスを繰り返すのかもね
0128デフォルトの名無しさん
2008/03/06(木) 17:15:34会社にはその会社の流儀って物があってね。
0129デフォルトの名無しさん
2008/03/06(木) 17:17:33>lstrcpy(buf, str.c_str());
は、lstrcpyの処理が終わるまで、誰もstrを変更しないことが保証されている。
>char *word = str.c_str();
>lstrcpy(buf, word);
は、どこかの禿が
>char *word = str.c_str();
>f(str);
>lstrcpy(buf, word);
と変更しない保証は何処にもないし、f(str)がstrを変更しない保証も無い
0130デフォルトの名無しさん
2008/03/06(木) 17:18:24なんかバカらしいぞそれ。
仕様をよく確認しなかったが、流儀に従って安全そうに書いたので
救われたって話ならわかるけど。
0131デフォルトの名無しさん
2008/03/06(木) 17:19:540132デフォルトの名無しさん
2008/03/06(木) 17:21:09お前ニートか無職だろ。
協調性がゼロみたいだもん。
0133デフォルトの名無しさん
2008/03/06(木) 17:22:30そんな話はしてねーよ
前者と後者で振る舞いが異なるはずがないと言ってるだけ
0134デフォルトの名無しさん
2008/03/06(木) 17:24:38>>100みたいな使い方が仕様に照らして問題ないという事実は変わらないだろ
0135デフォルトの名無しさん
2008/03/06(木) 17:25:44ちゃんと働いてるし、給料も沢山もらってるから心配スンナ
世の中はそんな妙な流儀を押し付けられるような職場ばかりじゃないってこと
0136デフォルトの名無しさん
2008/03/06(木) 17:35:320137デフォルトの名無しさん
2008/03/06(木) 17:44:28それはわかる。
ただ、俺から見れば117がやばい香りを感じるのは
129のような可能性があるからというのが最大の理由ではないかと思う。
0138デフォルトの名無しさん
2008/03/06(木) 17:50:14全く持って同意
同一データに、2通りのアクセス方法があると、間違いを起こす元になると思う
0139デフォルトの名無しさん
2008/03/06(木) 17:54:50なるほど、そういう見方もあるか
俺は、>>117がC++の実行モデルをあやふやにしか理解してないとか、
文を跨ぐと一時オブジェクトの寿命が切れるのと混同してるとか、そんなのを想像してた
それに、「ゴミになったのに」云々言ってるから、そのままのコードでもポインタが無効になるのを危惧しているように読める
0140デフォルトの名無しさん
2008/03/06(木) 17:57:27特別神経質になるほどのことでもないと思う。
0141デフォルトの名無しさん
2008/03/06(木) 17:57:30そういう意味では、イテレータも基のstringがconstでない場合は、
おちおち使っていられないよな。
例えばだけど、本質的にはこの2つに違いはないと思った。
(もちろん文字列中に\0はないとして)
char const* p = std::strchr(s.c_str(), 'a');
std::string::const_iterator it = s.find('a');
0142デフォルトの名無しさん
2008/03/06(木) 18:05:16賞味期限はいつか本当に切れるだろうが、それは今じゃない...
0143108
2008/03/06(木) 18:06:140144デフォルトの名無しさん
2008/03/06(木) 18:19:31だが正直でよろしい
0145デフォルトの名無しさん
2008/03/06(木) 18:49:070146デフォルトの名無しさん
2008/03/06(木) 19:24:41仕様を初めて知って、これからはいかにも前から知ってましたよって顔で
他の人にこの問題を説明するだろう。
0147デフォルトの名無しさん
2008/03/06(木) 19:25:38このスレではどうでもいいことだけどな。
0148デフォルトの名無しさん
2008/03/06(木) 20:54:340149デフォルトの名無しさん
2008/03/06(木) 21:03:520150デフォルトの名無しさん
2008/03/06(木) 21:07:440151デフォルトの名無しさん
2008/03/06(木) 21:11:410152デフォルトの名無しさん
2008/03/06(木) 21:15:31c.str を呼んだ場合、メモリの最確保が行われる可能性がある。
0153デフォルトの名無しさん
2008/03/06(木) 21:17:320154デフォルトの名無しさん
2008/03/06(木) 21:19:050155デフォルトの名無しさん
2008/03/06(木) 21:22:21今の規格ではバッファの連続性を保証していなくて、
次の規格ではバッファの連続性を保証する予定ではあるのだが、
連続性を保証したら data で参照、ポインタ、イテレータが失効する可能性は
もう無くなるとしてもいいような気がするんだけど、
最新のドラフトではそうなってないんだよな。
ミスなのか、それとも何か深い理由でもあるのか・・・。
0156デフォルトの名無しさん
2008/03/06(木) 21:25:17正直プライオリティ低いんだろ
どうでもいいわと思ってる委員が多いと予想
0157デフォルトの名無しさん
2008/03/06(木) 21:26:440x の x は16進数ってのもあながち冗談では済まなく・・・。
0158デフォルトの名無しさん
2008/03/06(木) 21:28:140159デフォルトの名無しさん
2008/03/06(木) 21:51:10もうここの連中には仕事任せられんな
今後は>>170にすべてを託すこととする
なお異論は受け付けない
0160デフォルトの名無しさん
2008/03/07(金) 04:52:010161デフォルトの名無しさん
2008/03/07(金) 09:34:55>void func(string &sArg)
> string sBuf = "AAAAAA";
> sBuf.swap(sArg);
のときって、sBufの内容がsArgに移し変えられるっていうのがswapの機能だと思います。
この場合、実装に依存するんだと思いますが、
メモリのエリアがガバっとコピーされるのではなくてクラスの参照を交換してくれるんでしょうか?
性能的に優れてるものだったら、使いまくりたいですし。
一度も使ったこと無いので、swap後にちゃんとメモリ保持しててくれるんだろうか、
落とし穴は無いだろーななんてガクブルしてます。
0162デフォルトの名無しさん
2008/03/07(金) 09:55:42stringだったら、内部で保持しているであろう
文字列へのポインタや長さなどといった変数だけが交換されるとみな仮定している。
一般的に、swapは例外を投げないとされており、
しかも、std::stringのswapはO(1)と規格で定められている。
だから、文字列の中身まで交換する実装はありえない。
0163161
2008/03/07(金) 10:29:50>一般的に、swapは例外を投げないとされており、
へぇー、勉強になりました。
>しかも、std::stringのswapはO(1)と規格で定められている。
勉強になりましたが、O(1)って何だ?_?
>だから、文字列の中身まで交換する実装はありえない。
あ、そうなんですか?
例外を発生できないとなると、参照を交換する以外に実装無いと思うんですが。
だって、交換じゃなくてコピーならば、メモリを確保しないといけないし、そうなるとエラーが発生する可能性があるような。
って素人なのに生意気逝ってすみません。
0164デフォルトの名無しさん
2008/03/07(金) 10:37:30文字列をコピーするなら、文字列が長くなればそれだけコピーに時間が掛かるから、この制限を満たせない。
詳しくは「計算量」でググれ。
>例外を発生できないとなると、参照を交換する以外に実装無いと思うんですが。
まさに>>162はそう言ってるんだと思うよ。
中身をコピーして交換するんじゃなくて参照(具体的にはポインタ)を交換する。
0165161
2008/03/07(金) 10:40:31>文字列の中身まで交換する実装はありえない。
つまり、中身をコピーする実装はありえない、って文章ですね。
で、そう言い切れる理由はO(1)で時間制限してて、”ま、参照を交換する実装にしる!”、っていわば指令が出てるわけですね。
0166デフォルトの名無しさん
2008/03/07(金) 10:58:42deep copyをするとno throwの保障ができなくなる。
0167161
2008/03/07(金) 11:00:02swapを使いまくりたくなりました。
vector<char>とstringの間で、swapする記述はありますでしょか?
vectorメモリは連続しているので、vector同士だとswapできるんじゃないかと思ったのですが。
直にメモリアクセス?イテレータンを無視し過ぎるのも良くないとは思わないでも無いですが。
0168デフォルトの名無しさん
2008/03/07(金) 11:07:45ない。実装上も、例えばstringがnull終端の分だけ余計に内部バッファを持っているなら無理。
>vectorメモリは連続しているので、vector同士だとswapできるんじゃないかと思ったのですが。
vector同士ならできる。
0169161
2008/03/07(金) 11:09:58なるほど。納得。下手にやるとはまりますね。
>vector同士ならできる。
vectorの異なる構造体同士でもできますか?
記述例超キボンw
0170デフォルトの名無しさん
2008/03/07(金) 11:19:320171デフォルトの名無しさん
2008/03/07(金) 11:28:20v.swap(v1);
で交換できる。vectorに限らずあらゆるコンテナで。
0172161
2008/03/07(金) 11:36:47つまり、コンテナが違うとswapはキャストやらなんやらやヴぁい記述になるわけですね(はまるからやらないけど)
0173デフォルトの名無しさん
2008/03/07(金) 13:11:25クラスメソッドの引数で、
>method(string s1) { method(s1.c_str()) }
>method(const char *s1);
みたいな感じで、オーバーロードで「string」も「char *」も両方受け入れるようにしてるんですが、
どちらか片方だけ定義、ということにできますでしょうか?
0174173
2008/03/07(金) 13:15:17まぁ、大差無いですか?
0175デフォルトの名無しさん
2008/03/07(金) 13:20:59stringだけ書いとけばconst char*からstringを暗黙に構築してくれると思うが、効率は良くないかも
0176デフォルトの名無しさん
2008/03/07(金) 13:37:12片方がconst char * なんだから、string const & の方がいいんでないかい?
で、どっちみちstringを受ける方もconst char * 版を呼び出すなら要らないわけで。
0177173
2008/03/07(金) 13:37:330178173
2008/03/07(金) 13:42:12>stringだけ書いとけば
の場合は、引数が入力である場合は、おk、
>片方がconst char * なんだから、string const & の方がいいんでないかい?
これ(つまり、& )を選択した場合は、2つ書かないといけないんですよね?
コンパイラで試せば良いのですが、皆さん普通はどうされてるのか知りたくて。
0179デフォルトの名無しさん
2008/03/07(金) 13:44:52わけがわからん。何がしたいのか書きなおしてくれ。
0180173
2008/03/07(金) 13:48:53つまり、
>stringだけ書いとけば
でおk。
>string const & の方がいいんでないかい?
でおk。
但し、char *を渡すと、W8030 Temporary used for parameter のウォーニングが出ると。
0181デフォルトの名無しさん
2008/03/07(金) 13:52:35俺だったら初めと終わりのイテレータを引数に取るようにする。
stringでもconst char*でもないやつもかかってこい。
0182173
2008/03/07(金) 13:53:05つまりやりたかった、
>string と char *の一本化、
および、
>参照渡しでメモリ節約&コンパイルウォーニング無し
の全て解決しました。orz
0183173
2008/03/07(金) 13:54:45はつみみです。
これ知っとくと大分楽できそうですね。何が良いのか調べてみます。
(参考サイトでも何でも教えて頂ければ参照します。レスで教えてというのも嫌われそうなので)
0184デフォルトの名無しさん
2008/03/07(金) 13:58:47文字列の内容がコピーされるから、メモリの節約にはなってない
0186173
2008/03/07(金) 14:58:05以外に頭が固いのが、stream系ですね。
っていうか、ifstreamとか引数にstring受け入れないっぽい。
0187デフォルトの名無しさん
2008/03/07(金) 15:26:37コードを書く前に、もう少しきちんと勉強したほうがいいと思います。
0188デフォルトの名無しさん
2008/03/07(金) 16:40:31{
const char* p_;
public:
StringArg(const string& str) : p_(str.c_str()) {}
StringArg(const char* str) : p_(str) {}
const char* get_arg() const { return p_; }
};
method(const StringArg& arg);
0189172
2008/03/07(金) 16:49:34はじめそれに近い形で書いてたんですが(違いはstring側はconstにしてなかったとこだけ)、
メソッド宣言2行になると、以外にクラス部品作るのがしんどくて。
効率悪くても1つにしたいな、と思いました。
で結局、
>StringArg(const string& str)
の方だけ活かして、
巨大なバッファで、かつ、char *の可能性がある場合のみは、188 の通り、
2つ宣言しようかと思っています。
0190デフォルトの名無しさん
2008/03/07(金) 16:50:09172じゃなくて、173でした。
0191デフォルトの名無しさん
2008/03/07(金) 16:58:43多分お前は>>188を誤読してる
const char *をとるメソッドもconst string &をとるメソッドも用意せずに、
const StringArg &をとるメソッドを用意しろってことだろ
0192デフォルトの名無しさん
2008/03/08(土) 09:00:47std::stringを渡したい場合は↓じゃあかんのか
std::string s;
Method(s.c_str());
0193デフォルトの名無しさん
2008/03/08(土) 20:47:51using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(4);
(*s.begin()) = 5;
return 0;
}
上のプログラムは違法ですよね?
ウチのコンパイラは文句を言わないんだけどおかしいですよね?
0194デフォルトの名無しさん
2008/03/08(土) 20:53:45とりあえずg++だとエラーになった
0195デフォルトの名無しさん
2008/03/08(土) 20:59:060196デフォルトの名無しさん
2008/03/08(土) 21:03:38C++2003 に準拠しているならそれでも規格の範囲内。
変更できないことが明記されるのは次の C++0x から。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
コンパイル通るからといっても、まずいことがわかってるなら
やらないでおいたほうがいいね。
0197デフォルトの名無しさん
2008/03/08(土) 21:04:28Effective STL 第22項をどうぞ。
0199デフォルトの名無しさん
2008/03/10(月) 08:45:25resizeした後、・・・1
c_str()でポインタ取って、・・・2
memcpy・・・3
してます。
2ってSTL的には読み込み専用ポインタであり間違ったコードなんですが、
動作してるのでほっとこうか、正しく書こうか迷ってます。
どうしたら良いでしょう?
0200デフォルトの名無しさん
2008/03/10(月) 08:47:18間違ったコードを正しく書くのに、何を迷うの?
0201デフォルトの名無しさん
2008/03/10(月) 08:50:50必要な知識は全部持ってるみたいだが、何を訊きたいんだ?
未定義動作に依存するという欠点よりもそのコードが持つ利点が大きいと考えるなら
それを使い続ければいいし、そうでないなら書き換えればいい
0202デフォルトの名無しさん
2008/03/10(月) 08:50:55じゃ、直しておきまつ。
0203デフォルトの名無しさん
2008/03/10(月) 20:18:13イテレータにstd::copyでもいけるし。
0204デフォルトの名無しさん
2008/03/11(火) 09:05:07イテレータンって参照するだけじゃないんだ。
イテレータンがメソッド持ってるって考え方がイマイチわかんないんだおね。
0205デフォルトの名無しさん
2008/03/11(火) 15:29:400206デフォルトの名無しさん
2008/03/11(火) 19:51:250207デフォルトの名無しさん
2008/03/11(火) 20:59:59ifstream ifile(フルパス名);で失敗してしまうのですが、これは仕様なのでしょうか?
仕様なのでしたら回避策はあるのでしょうか?
Visual Studio 2005SP1を使用しています。
よろしくおねがいします。
0208デフォルトの名無しさん
2008/03/11(火) 21:05:450209デフォルトの名無しさん
2008/03/11(火) 21:05:590210デフォルトの名無しさん
2008/03/11(火) 21:29:37#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main(int argc, char **argv)
{
ifstream ifile("新規テキスト ドキュメント.txt");
if(ifile) {
MessageBox(NULL, "success", "info", MB_OK);
ifile.close();
} else {
MessageBox(NULL, "failed", "info", MB_OK);
}
return 0;
}
結果はfailedとでます。
0211デフォルトの名無しさん
2008/03/11(火) 21:31:17フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。
ifstream ifile("d:\\新規テキスト ドキュメント.txt");
0212デフォルトの名無しさん
2008/03/11(火) 21:32:25つーか、このスレより環境依存OKのスレかWindows関連のスレの方がいい希ガス。
0213デフォルトの名無しさん
2008/03/11(火) 21:42:30環境依存スレに行ってみます。
0214デフォルトの名無しさん
2008/03/12(水) 03:34:34要素を指していたポインタが無効になり、ひどい目にあうことが
あるということを知りました。
そこで質問なのですが、引越し時の要素のコピーは
コピーコンストラクタを使って行われるのでしょうか?
それとも単純にmemcpyなどで行われるのでしょうか?
0215デフォルトの名無しさん
2008/03/12(水) 04:23:23コピーコンストラクタじゃなきゃヤバイでしょ。
あくまで例だけど、int型のメンバxと、そのアドレスを持つint*型のメンバpxがあって、
pxの値をmemcpyなんかした日にはえらいこっちゃ。
0216デフォルトの名無しさん
2008/03/12(水) 07:50:53もすこし具体的にどうぞ。
>>215
あんたも何を言いたいんだか。
0217デフォルトの名無しさん
2008/03/12(水) 07:51:340218デフォルトの名無しさん
2008/03/12(水) 07:53:22それは別問題
0219デフォルトの名無しさん
2008/03/12(水) 07:56:14再割り当て時にはコピーコンストラクタが使われるよ。
0220デフォルトの名無しさん
2008/03/12(水) 07:57:26俺は第三者だけど、>>214が何を訊きたいかは分かるし、>>215の回答も理解できるよ。
>>215は当を得た回答だと思う。
0221217
2008/03/12(水) 08:01:58コピーコンストラクタでpx=&xが必要ってことだな。多分。
0222デフォルトの名無しさん
2008/03/12(水) 08:06:430223デフォルトの名無しさん
2008/03/12(水) 08:07:42要素は引っ越しません。
0224デフォルトの名無しさん
2008/03/12(水) 08:46:07コピーコンストラクタという言葉を使っているところからして、
ユーザー定義型がvectorにどう扱われるかを訊きたがってるんだろうな、と判断した上で、
「コピーコンストラクタを用いなければ"正しく"コピーできない型があり得るのに、
vectorが内部で勝手にmemcpyによるコピーで満足しちゃうなんてことは無いよ」
って回答した次第。
0225デフォルトの名無しさん
2008/03/12(水) 08:49:23嘘をつくな
0226デフォルトの名無しさん
2008/03/12(水) 08:50:39規格に"引っ越し"という言葉は書いてないという揚げ足をとってるのか?
それとも単にC++を知らないだけ?
0227217
2008/03/12(水) 09:01:52関係ないけどクラスをmemcpy、memcpyするソースをよく見かける。怖くて仕方ない。
0228217
2008/03/12(水) 09:02:250229デフォルトの名無しさん
2008/03/12(水) 09:03:130230デフォルトの名無しさん
2008/03/12(水) 09:05:390231217
2008/03/12(水) 09:15:12落ちるとは限らないよ。仮想関数がないクラスではうまくいく。(memsetでセットする値が適切なら)
仮想関数があるクラスでmemset(this,0,sizeof(this))とかやると
仮想関数ポインタが0になるので、
ポリモーフィズム使用時にNULLポインタアクセスで落ちた。
だから抽象クラスにしたいときには、memsetしてないか全部チェックせなあかんかった。
>>230
そうだね。特に組込系が多いね。クラスを構造体の延長として使ってる。
0232217
2008/03/12(水) 09:22:43こういう変なことする人もいる。class S が 仮想関数を持つクラスをメンバ変数に持ってたら
ダメじゃんって突っ込みたい。
スレ違いでゴメン!
0233デフォルトの名無しさん
2008/03/12(水) 09:28:300234デフォルトの名無しさん
2008/03/12(水) 10:05:25君がインストラクタになってあげなさい
0235デフォルトの名無しさん
2008/03/12(水) 12:47:55copyを引っ越しと言うのは無理があり過ぎる。
0236デフォルトの名無しさん
2008/03/12(水) 12:49:21引越しは後片付けしてから出て行くよ。
0237217
2008/03/12(水) 15:43:340238デフォルトの名無しさん
2008/03/12(水) 21:05:27「copyを引っ越しと言」ってるようには見えないよ。「引越し時の要素のコピー」って書いてある。
コンピュータデータのmoveは、実際には「copyする」ことと「元を削除する」ことで成り立っているわけで、
つまり「move(ここではvectorの要素の再配置のこと)の手段としてのcopy」の表現だろう。
0239デフォルトの名無しさん
2008/03/12(水) 21:28:37そういうもの。
0240デフォルトの名無しさん
2008/03/12(水) 22:56:24(boost::shared_ptr etc)
0241デフォルトの名無しさん
2008/03/12(水) 23:00:160242デフォルトの名無しさん
2008/03/14(金) 00:11:290243214
2008/03/14(金) 01:02:08ありがとうございます。
でも、*ほとんどの* ケースでは、単純なmemcpyで済みそうなのに、
いつでもコピーコンストラクタが使われるという仕様に疑問を感じます。
コピーコンストラクタが使われるとなると、コピー元のオブジェクトに
対してデストラクタを呼び出す必要があります。これは、*ほとんどの*
ケースでは全く馬鹿馬鹿しい無駄です。
それならreserve使え、とおっしゃるかもしれませんが、どれだけの
領域をreserveしておけばいいのか、前もって計算できないことも
よくあります。
引越し時のコピーはmemcpyで行われるべきではないでしょうか?
>>215さんが出した例のような場合、ユーザーはreserveを使います。
どうでしょう? だめ?
0244デフォルトの名無しさん
2008/03/14(金) 01:08:070245デフォルトの名無しさん
2008/03/14(金) 01:26:34そう、毎度コピーするのは無駄と誰もが思ったから、
今度の規格改定でムーブセマンティクスというものが導入されようとしている。
0246オガちゃん萌え ◆tyvkWCNtzY
2008/03/14(金) 01:27:09アーキテクチャ依存すんだからOOPは役に立たん
ドメインでアーキテクチャ依存せんようにするにはやむえない
…が、インフラのC型記述は拡張子.cにして欲しい
イヴァーヤコブソンはそんなユースケース駆動モデルを奨めている
STLですらQACでNGになられたんじゃ参るストーン
0247デフォルトの名無しさん
2008/03/14(金) 01:47:52彼が不満に思っている状況の大半では,
move semantics は何の改善ももたらさないのでは?
0248デフォルトの名無しさん
2008/03/14(金) 01:53:02前のオブジェクトのデストラクタは実質やることなくなる。
こういう問題だと思っていた。214が納得するbゥどうかは別とbオてだけど。
0249デフォルトの名無しさん
2008/03/14(金) 02:09:19memcpy によってコピーできるオブジェクトというのは,
(C++0x において条件が緩和される) POD 型のオブジェクトに
およそ相当すると思いますけれど,これらのオブジェクトに対しては
コピーの操作と (move semantics でいうところの) move の操作は
同じ操作になると考えられるので「move semantics によって改善される」というのは
まずいのではないかな,と.
デストラクタに関しても, move を使っても copy を使っても
「実質やることがない」のはなんら変わりはないと思います.
0250デフォルトの名無しさん
2008/03/14(金) 10:11:23ああ、たしかにPODだとそうだね。
言葉足らずですまん。俺は非POD型を入れることことを考えていた。
というのも243でデストラクタを呼び出さなければならないと言っているから、
214=243は非POD型を念頭に置いているのだと思ったため。
0251デフォルトの名無しさん
2008/03/14(金) 12:04:02手元のVC8ではvector<char>とかvector<int>ならmemmoveを使ってくれたよ。
アラインメントを考慮してrep movsdで転送。
struct Foo{int a; int b;}; vector<Foo>だと単純にループ1まわりにつき
8byte転送するようなコードになってた。
PODを判定できれば両方memmoveに出来るんじゃないかな。
0252デフォルトの名無しさん
2008/03/14(金) 12:23:370253251
2008/03/14(金) 13:03:30俺はただ、>>243がpush_backでのバッファ拡張時にmemcpyやmemmoveのような
効率的なコピーが使われないと思いこんでいるようだったから、わかりやすい
反例を示しただけだよ。
>>243
> *ほとんどの* ケースでは、単純なmemcpyで済みそうなのに、
それで済むケースは実際にそうなる場合があるよ、と。
0254デフォルトの名無しさん
2008/03/14(金) 13:22:120255251
2008/03/14(金) 13:40:35ならないケースの話?
そういうクラスはPODとは呼ばないけど。
0256デフォルトの名無しさん
2008/03/14(金) 14:09:38ちょうどVC8には、__is_podがある。
ただ、手元のVC9 EEのincludeディレクトリをgrepしたが、
使っていないみたいだったorz。
0257デフォルトの名無しさん
2008/03/14(金) 19:03:11当環境ではエラーを起こすのですが、原因わかりますでしょうか
#include <set>
#include <iostream>
int main(){
using namespace std;
set<int> nums; // 空のset
return 0;
}
この文を実行した場合、実行時に
Run-Time Check Failure #2 - Stack around the variable '_Lk' was corrupted.
と表示され,xtreeのソースが表示されます。
環境:WinXP Pro SP3
Visual Sturio 2008
0258257
2008/03/14(金) 19:12:24単純にPlattformSDKのcrtにあるxtreeが読まれていたからでした
お騒がせしました。
...OSまで再セットアップしたのにorz
0259デフォルトの名無しさん
2008/03/14(金) 20:06:210260デフォルトの名無しさん
2008/03/14(金) 20:16:400261デフォルトの名無しさん
2008/03/14(金) 20:18:100262デフォルトの名無しさん
2008/03/14(金) 20:22:360263デフォルトの名無しさん
2008/03/14(金) 22:15:57クラスの役割にかかわらず名前がつけられるなんて思わないでください。
0264オガちゃん萌え ◆tyvkWCNtzY
2008/03/15(土) 17:21:41クラス名決める前に設計段階で静的モデルからクラス図作るからその段階で関数オブジェクトだろうがクラスだろうがメソッドだろうが役割に適した名前になるんじゃないの?
設計改善してコードリファクタリングの過程でまた適した名前にすると思うんだが?
STLとは関係ないし
使い捨てツール作るなら、名前なんかテキトー
動けばよろし
0265デフォルトの名無しさん
2008/03/15(土) 17:37:28他言語なら匿名メソッドとかラムダですませちゃうような奴
そんなん設計段階で無い事の方が多い
0266デフォルトの名無しさん
2008/03/15(土) 21:04:140267デフォルトの名無しさん
2008/03/15(土) 22:12:04by
0268デフォルトの名無しさん
2008/03/18(火) 01:34:41日本のプログラマ人口は20万人だそうです(かなり不足して
いるらしい)。この20万人の中で、C++の言語機能を一通り
理解して、STLやBoostなどのライブラリをそれなりに使い
こなすことのできるプログラマは何人ぐらいだと推測しますか?
あなたは20万人の中で上位何パーセントの層に属しますか?
0269デフォルトの名無しさん
2008/03/18(火) 01:41:050270デフォルトの名無しさん
2008/03/18(火) 01:49:52(そういう会社の数が激減したと言うか)
国内でスキルを持っていても活躍の場があまりない気がする。
0271デフォルトの名無しさん
2008/03/18(火) 01:53:09やっぱり?でもマ版に入り浸っている人じゃなくて、
具体的なC++の質問に答えられる人にききたいんです。
0272デフォルトの名無しさん
2008/03/18(火) 01:58:2520*0.3*0.3=1.8くらいとかだったらいいなぁ・・・
0273デフォルトの名無しさん
2008/03/18(火) 02:02:42C++経験あったらSTLも使ってるんじゃないの? (単純な疑問文です。)
0274デフォルトの名無しさん
2008/03/18(火) 02:11:440275デフォルトの名無しさん
2008/03/18(火) 02:16:140276268
2008/03/18(火) 02:19:12STLを使ってるといってもいろいろなレベルがあります。
vectorぐらいは誰でも使っていると思いますが、
コンテナとアルゴリズムを駆使して、コンパクトで
エレガントなプログラムを書くとなるとどうでしょうか?
>>268では "それなりに使いこなすことのできる" 人の数
を問題にしています。
0277デフォルトの名無しさん
2008/03/18(火) 03:55:520278デフォルトの名無しさん
2008/03/18(火) 04:54:272000人もいないだろ
0279デフォルトの名無しさん
2008/03/18(火) 05:10:49マ板に行け
0280デフォルトの名無しさん
2008/03/18(火) 09:06:300281デフォルトの名無しさん
2008/03/18(火) 10:10:38Boostって組み込みじゃ氏んでもツカエンよな。
0282デフォルトの名無しさん
2008/03/18(火) 10:34:45効率が良くて高速なコードが要求されることが多いような気がする。
両立できればいいんだろうけどさ。
0283デフォルトの名無しさん
2008/03/18(火) 10:39:420284デフォルトの名無しさん
2008/03/18(火) 10:40:29開発環境がそれしかサポートしてないだけ
0285デフォルトの名無しさん
2008/03/18(火) 10:46:29C++はじまた。
M$/V$オワタw
0286デフォルトの名無しさん
2008/03/18(火) 19:49:08活躍の場って組み込み系か?
DB系だとCなんかよりJava VB C#のほうがラクだし需要あるし
ダカラナニ?って感じなんだが。
仮にその上位ってやつだったとして
給料が高くなる保障があるわけでもないし
くだらない話題だと思わないわけでもないかもしれない可能性がある
0287デフォルトの名無しさん
2008/03/18(火) 22:12:540288デフォルトの名無しさん
2008/03/18(火) 23:14:02でも・・・C++かわいいよC++
0289デフォルトの名無しさん
2008/03/18(火) 23:14:440290デフォルトの名無しさん
2008/03/18(火) 23:19:200291デフォルトの名無しさん
2008/03/18(火) 23:21:460292デフォルトの名無しさん
2008/03/18(火) 23:28:220293オガちゃん ◆tyvkWCNtzY
2008/03/18(火) 23:39:50最善の選択肢とは限らないし
だけど可汎的だから使うのはさほど大変じゃないと思う…が、使いこなすのはやはり難しいかも
JAVAのステータスがどんどん上がってC++のオブジェクト指向開発してるPRJ減ってきたような
C++でも構造体をpackしてmemcpyしてるのざらだもんなあ
今のPRJはユースケース駆動モデル(Rational統一プロセス)でOOPに加えてAOP的発想あるが…
スレ違いスマソ
0294デフォルトの名無しさん
2008/03/19(水) 03:27:010295デフォルトの名無しさん
2008/03/19(水) 04:13:55型指定が冗長だからtypedefかヘルパー関数の嵐になるのは仕様。
C++0xのautoで解決されるのも仕様。
既存のライブラリをC++0x用にせっせと書き直す作業が待っているのも仕様。
0296デフォルトの名無しさん
2008/03/19(水) 07:23:45メンバ変数に書く際には auto じゃどうしようもないだろうし。
0297デフォルトの名無しさん
2008/03/19(水) 09:42:060298デフォルトの名無しさん
2008/03/19(水) 10:15:40既存のライブラリをわざわざC++0xでしか通らないように書き換えたりするの?
0299デフォルトの名無しさん
2008/03/19(水) 10:20:21コイツは。。
0300デフォルトの名無しさん
2008/03/19(水) 15:42:210301デフォルトの名無しさん
2008/03/19(水) 15:45:270302デフォルトの名無しさん
2008/03/19(水) 15:50:05でも純粋C++なら安定部品を作ればよいだけ。
0303デフォルトの名無しさん
2008/03/19(水) 16:22:00できる人からできない人まで集まってしまうという点では大変だと思っている。
同じようなレベルの人同士でならそう大変でもないはず。
0304デフォルトの名無しさん
2008/03/19(水) 17:28:320305デフォルトの名無しさん
2008/03/19(水) 18:01:01だから困るかっていうと困るほどのものでもないんだが
0306デフォルトの名無しさん
2008/03/19(水) 18:02:16C++がUNIXモンリーで単なるC言語のプリプロセッサだったころの、
クラスって何、
の時代しってんのかぁ?ゴルァ。
0307デフォルトの名無しさん
2008/03/19(水) 18:05:18C++から一旦Cのコード吐いてからコンパイルしてたな。
もちろん例外処理なんて粋なもんは無かった。
0308デフォルトの名無しさん
2008/03/19(水) 18:06:45>CとC++の差が分かってない人がほんと多かった気がする
~~~~~~~~
なら分かるんだけどね、ってどうでもいいスレ違い続けてんじゃねえ!ゴルァ。
0309デフォルトの名無しさん
2008/03/19(水) 18:09:53STLの話しろや
0310デフォルトの名無しさん
2008/03/19(水) 18:10:510311デフォルトの名無しさん
2008/03/19(水) 18:14:28できて当たり前。
できないのは単にやってないか馬鹿だから。
0312デフォルトの名無しさん
2008/03/19(水) 18:17:11一通りやり終えるまでどんだけ。
0313デフォルトの名無しさん
2008/03/19(水) 18:17:16おれ深く勉強したけど、もう1年くらいやってないから
忘れてるわC++ アハハハ
0314デフォルトの名無しさん
2008/03/19(水) 18:19:510315デフォルトの名無しさん
2008/03/19(水) 19:00:490316デフォルトの名無しさん
2008/03/19(水) 19:12:57TR1の普及で使うようになってくれるといいな。
0317デフォルトの名無しさん
2008/03/19(水) 19:19:420318デフォルトの名無しさん
2008/03/19(水) 19:54:44何年かかることやら
0319デフォルトの名無しさん
2008/03/19(水) 20:46:08ほとんどの人が使ってない罠。
まずは啓蒙からだな・・・。
0320デフォルトの名無しさん
2008/03/19(水) 20:51:21もうそんな時代ではない。細部を理解する必要はあるけど。それこそメイヤーズ
みたいな貴重な本があるし。
0321デフォルトの名無しさん
2008/03/19(水) 20:55:19自家製の refcount_ptr とか適当に作っちゃうなぁ。
代入や解放をスレッドセーフにしたいときとかも。
0322デフォルトの名無しさん
2008/03/19(水) 20:56:42shared_ptr まで必要になるのって意外と少ない気がする。
0323デフォルトの名無しさん
2008/03/19(水) 21:00:51んだから何が不満なんだよと言いたい。それとも何処の馬の骨とも分からないやつ
が作った自作ライブラリのほうが安全なのかよと。上司に言いたい。
0324デフォルトの名無しさん
2008/03/19(水) 21:05:42boost のライセンスってゆるゆるだよね?
0325デフォルトの名無しさん
2008/03/19(水) 21:13:21(& Bootst はレビューしたくないから) 自前で書く、ということもあるな。
0326デフォルトの名無しさん
2008/03/19(水) 21:14:49もう一度レビューするのも車輪の最発明と大して変わらない作業のような。
0327デフォルトの名無しさん
2008/03/19(水) 21:16:08滑稽じゃね?と上司に言いたい。
0328デフォルトの名無しさん
2008/03/19(水) 21:18:08あんなの読みたくもないが。
0329デフォルトの名無しさん
2008/03/19(水) 21:56:080330デフォルトの名無しさん
2008/03/19(水) 22:12:250331デフォルトの名無しさん
2008/03/19(水) 22:34:260332デフォルトの名無しさん
2008/03/20(木) 05:11:22intrusive_ptr::operator=()が、いわゆる「スワップ技法」使ってるんだけど、これがBCB6だと遅くて。
こういう「局地的な場面」でまでboostを絶対視するのはいかんってことだね。
概ね信じろ、しかし盲信はするな、と。まぁ当たり前のことなんだけど。
0333デフォルトの名無しさん
2008/03/20(木) 05:25:050334デフォルトの名無しさん
2008/03/20(木) 05:30:120335デフォルトの名無しさん
2008/03/20(木) 05:55:08言いたいのだろうけどそんなのはローカルの事情でしかないだろう。
一々ローカルにかまってたら標準の意味がないだろうよ。
0336デフォルトの名無しさん
2008/03/20(木) 06:14:08>概ね信じろ、しかし盲信はするな
っていう一般的な意見を述べてるだけだろ
話題自体はローカルじゃないし、標準がどうあるべきだという話もしてないと思う
0337デフォルトの名無しさん
2008/03/20(木) 06:31:42その結論に持っていくネタがなんだかなって話だろ?
俺も小ささとか速度で難癖つけるのはどうもずれているような気がする。
誰も速度が速いとかオールラウンドに使えるという話はそもそもしていないんじゃね。
0338デフォルトの名無しさん
2008/03/20(木) 06:34:34> ローカルの事情で使いものにならないこともあると言いたいのだろうけど
いや、boostの実装には「手を抜いている」部分もあり、必ずしも細部までエキスパートの優れた仕事って
わけではない、という話。
つまり「ローカルの事情の話」ではなく「ローカルの事情を通して知ったboostの実装の話」ね。
だから「boostの話はスレ違いだ」は受け入れるけど、「上司の意向の話」以上にずれた話題と思われるのは心外だなw
そこから来る結論は>>336の通り。初心者がboostへの信頼を信仰にまで高めちゃいそうな流れだったから、
思考停止だけはしちゃいけないよね、というレスが事例付きで一つくらいあったほうがバランス良いと思ったんだ。
0339デフォルトの名無しさん
2008/03/20(木) 06:41:18>>337
難癖ではないよ。boost大好きだし。
> 誰も速度が速いとかオールラウンドに使えるという話はそもそもしていないんじゃね。
いや、>>332もそういう話はしてない。
「エキスパートが作ってるという話」「ライブラリのプロが書いたソースだという話」の一環として書いた。
エキスパートとかプロっていう表現が踊り出すと(この表現自体は正しい)、ある種の人間に
変な思考を植え付ける結果になることがよくあるんだ。
冷静に判断しなきゃいけないところで「boostのほうが凄いに決まってる!だってエキスパートが作ったんだもん!」
「だってライブラリのプロが書いたんだもん!」みたいなね。
そんな馬鹿は放っておけばいいという意見もあるだろうけど、でも俺は今回、信じすぎは良くないからね、
という一言があったほうが、流れとして適切だと判断したから書いたわけ。
0340デフォルトの名無しさん
2008/03/20(木) 07:18:46レビューされているぶん、俺たちが会社で書く似たようなコードより信頼性は高いだろう
これだけの話だろ
車輪が環境に合わない場合は自作するしかないけど(>>333 の場合)
自分で書くよりは信頼性が高いだろうというだけの話が
何故信仰や絶対という話になるのか理解に苦しむな…
0341デフォルトの名無しさん
2008/03/20(木) 07:20:390342デフォルトの名無しさん
2008/03/20(木) 07:35:59そう、それだけの話。
で、>>332も「それだけの話」なんだけど(boostは概ね信頼できるという「事実」に対して、
必ずしも我々を越えちゃいないという「事実」を例示付きで添えただけ)、妙に突っ込む人がいて長くなってる。
0344デフォルトの名無しさん
2008/03/20(木) 07:47:11見ればわかるけど・・・。
0345デフォルトの名無しさん
2008/03/20(木) 07:50:01boostは盲信するな!絶対視するな!
こんなイミフな展開にツッコミ入れない人間がどこにいるの。ワロス
0346デフォルトの名無しさん
2008/03/20(木) 07:52:42そもそも>>332一つなら「展開」でも何でもないよ。単発だもの。「展開」は皆で「作った」んだよ。
0347デフォルトの名無しさん
2008/03/20(木) 07:54:29数撃ちゃ当たる状態だな。そんなに必死に「やり込めたく」なるのかなぁ、俺のレス。
0348デフォルトの名無しさん
2008/03/20(木) 08:12:22皆さんはどのように理解してデバッグなさっていますか?
0349デフォルトの名無しさん
2008/03/20(木) 08:30:04要約すると、 std:basic_string< 〜 > とかを string に置換して読むこと、
こういうエラーが出たときはこういうミスを犯している可能性が高いっていう対応を知ること。
俺はエラーメッセージは読まずにえらーが出てる最初の行だけ見て直すけどw
0350デフォルトの名無しさん
2008/03/20(木) 09:34:19エラーメッセージは見るな
自分のソースを見ろ
0351デフォルトの名無しさん
2008/03/20(木) 09:35:110352デフォルトの名無しさん
2008/03/20(木) 09:36:01コンパイラのせいにするよなぁ
C++どころかCの頃からそうだったなぁ
0353デフォルトの名無しさん
2008/03/20(木) 09:46:100354デフォルトの名無しさん
2008/03/20(木) 10:49:36その呼出元も表示してくれるので、
ひとまず自分のソースコードのどこの行が悪いのかはわかる。
あとはにらめっこの始まりなんだけどね。
0355デフォルトの名無しさん
2008/03/20(木) 12:23:57それで大体の場合は分かる。
それで分からない場合、
次はテンプレートの型とエラーの種類を見る。
長ったらしいテンプレート引数は別に見なくていい。
それで分からない場合にはいよいよテンプレート引数を見るけど、
大体はその中で自分で作ったクラスが悪さしていることが多いのでそれをまず見る。
それでもダメな時は全体を見る。
0356デフォルトの名無しさん
2008/03/20(木) 13:12:39名前照合に失敗してるとか
そういうことが多いような
0357デフォルトの名無しさん
2008/03/20(木) 13:19:100358デフォルトの名無しさん
2008/03/20(木) 13:29:42constの有無程度なら「constがある/ない」で警告してくれればいいんだけど、型を変換できないと言われてtypedefしてない型を延々出されると何事かと思う。
もう慣れたけど。
0359デフォルトの名無しさん
2008/03/20(木) 13:57:09VS付属→STLPortとか実装を取り替えると同じエラーでもメッセージがぜんぜん違ってくれる素晴らしい罠。
0360デフォルトの名無しさん
2008/03/20(木) 14:02:010361デフォルトの名無しさん
2008/03/20(木) 20:42:46特に納品物というか成果物としては。いくらboostのライセンスが軽いとはいえ。
boostの一部がTRで採用されて0xに反映されたら標準ライブラリとみなせるだろうけど…
いっぽうで、ツール類作るときは積極的に使用する。
tokenizerとかregexとか、bindなんか使うとやみつきになる
その点、STLはまずコンパイル・リンクエラーなってる場合はほぼ間違いなく自分のコードに問題あり
もしくは、VC++とかBorlandC++とかそういうコンパイラ
でも、テンプレートが展開されたエラーは原因を見つけるのに慣れないと苦労するのも確か。
0362デフォルトの名無しさん
2008/03/20(木) 20:53:020363デフォルトの名無しさん
2008/03/20(木) 20:54:40ライブラリ作成者よりも優れていると申しております。
0364デフォルトの名無しさん
2008/03/20(木) 20:55:030365デフォルトの名無しさん
2008/03/20(木) 21:07:180366デフォルトの名無しさん
2008/03/20(木) 21:11:49361だが、過信してはいないつもりだが、エラーの要因はまず自分のソースを疑うね
その点はboostでも同じだよ
まぁ、そう考えればSTLはバグがないとまでは言わなくとも(実際にある)、自分のソースを疑うってだけだ
だから過信、盲進してるかもな
ただ、boostはコンプライアンス上の問題やらでdefect発生時にどうなのよ?ってだけだよ
技術的な観点では、俺にとってboostはSTLのサブセットだよ。なにせ、boostの開発に携わってるのは
C++標準化の連中なんだから
それに、>>363のいうようにあらゆるケースや検証をして世の中に出てきたSTLと、必要なテストしかしてない
自分の作成したコードが正しいなんて言う根拠はどこにもない
で、>>362はSTLよりも優れたテンプレートを作っていると?w
0367デフォルトの名無しさん
2008/03/20(木) 21:18:080368デフォルトの名無しさん
2008/03/20(木) 21:20:04ippってなんじゃらほい
0369デフォルトの名無しさん
2008/03/20(木) 21:23:05コンパイラ作成者やM$のデヴェもいる。
0370361
2008/03/20(木) 21:32:54俺、boost信者になってからは寧ろ好きになったw
だけど、自分のコードはやはり .h を拡張子にしたいね。前プロジェクトではboost使いまくりーの、
.hppを拡張子にしまくりーのだったがw
0371デフォルトの名無しさん
2008/03/20(木) 21:40:51>boostの一部がTRで採用されて0xに反映されたら標準ライブラリとみなせるだろうけど…
標準ライブラリと見なせることとコードの信頼性に何か関連性はあるのかね、と思ったのよ。
0372デフォルトの名無しさん
2008/03/20(木) 21:45:03で、boost使ってて何かトラブったことあんの?
0373デフォルトの名無しさん
2008/03/20(木) 21:51:19すくなくともベンダがリリース前にテストしたという信頼性は担保されるだろ
0374デフォルトの名無しさん
2008/03/20(木) 21:54:34C++専用のヘッダは hpp とか hh とか hxx とか使って欲しい
# emacsで開くとc-modeになってしまったという経験がある
# もちろんファイルの先頭にモードを書いておけば済む話だけども
0375デフォルトの名無しさん
2008/03/20(木) 21:57:05自分で書いたコードが正しいと確信するための作業をboostにも適用すればいいと思う
…標準ライブラリもいろいろで、C++の仕様見てないんじゃないかと疑いたくなるようなのもあるよ
0376デフォルトの名無しさん
2008/03/20(木) 22:05:07逆。
標準ライブラリと見なせなくても boost には標準ライブラリと同等の信頼性はあると思っている。
0377デフォルトの名無しさん
2008/03/20(木) 22:14:20Boost.PPの滅多に使われないマクロあたりに嫌なバグが潜んでたとしても驚かないな
0378デフォルトの名無しさん
2008/03/20(木) 22:27:47# vimのcpp用indentスクリプトの貧弱さは泣けてくる
0379デフォルトの名無しさん
2008/03/20(木) 23:22:490380デフォルトの名無しさん
2008/03/20(木) 23:27:46auto_ptr
は使うなと
0381デフォルトの名無しさん
2008/03/20(木) 23:39:18はげど!
C互換もないのに.hって何だよ?と。
しかしライブラリを見てたらだんだん
ヘダファイルに拡張子なくてもよくね?と思えてきた
0382デフォルトの名無しさん
2008/03/20(木) 23:40:52エディタで開くときに面倒・・・ただそれだけ。
0383デフォルトの名無しさん
2008/03/20(木) 23:46:180384デフォルトの名無しさん
2008/03/20(木) 23:47:130385デフォルトの名無しさん
2008/03/20(木) 23:55:420386デフォルトの名無しさん
2008/03/20(木) 23:58:240387デフォルトの名無しさん
2008/03/21(金) 00:03:46それってファイル壊してない?そんなOSがあんの?
0388デフォルトの名無しさん
2008/03/21(金) 00:03:490389デフォルトの名無しさん
2008/03/21(金) 00:08:28↓
xxx.jpg
「劣化しますがよろしいですか?」
(OK) (キャンセル) (pngにする)
そんなOSがあったら、使いたくはないが、触ってみたい。
0390デフォルトの名無しさん
2008/03/21(金) 00:10:130391デフォルトの名無しさん
2008/03/21(金) 00:12:35結局、そこが一番問題じゃないかね。
0392デフォルトの名無しさん
2008/03/21(金) 02:08:23実行コスト的にはやっぱり不利になるんかな?
大した違いじゃ無いだろうけど、ちょっと気になる。
0393デフォルトの名無しさん
2008/03/21(金) 05:31:040394デフォルトの名無しさん
2008/03/21(金) 07:07:25参照カウンタが0になった時にはメモリの解放が余分に必要。
0395デフォルトの名無しさん
2008/03/21(金) 09:32:339までのMac OSってそうじゃないの?
0396デフォルトの名無しさん
2008/03/21(金) 10:08:28あと削除子保持するコストも必要だと思う。
0397オガちゃん萌え ◆tyvkWCNtzY
2008/03/21(金) 19:34:49が、やはりC++とCのヘッダファイルを区別するのに、hとhxxにしときたい
JAVAとかC#プログラマとかはC/C++でc/cpp、hのペアのファイル直すのがめんどいらしい
0398デフォルトの名無しさん
2008/03/21(金) 20:20:44違うよ。
いわゆるMacBinaryはデータフォークとは明確に分離してる。
まあ、他のプラットフォームにしてみれば異質なものに代わりはないけど。
0399デフォルトの名無しさん
2008/03/21(金) 20:48:12どうでもいいけど
0400デフォルトの名無しさん
2008/03/22(土) 02:44:49ファイルタイプとクリエータがある感じ。
MacBinary形式と言うのは、これらのプロパティを128バイトのヘッダとし、その後にデータフォークと
(必要なら)リソースフォークを連結した特殊なファイル形式のこと。
0401オガちゃん萌え ◆tyvkWCNtzY
2008/03/22(土) 10:16:01ファイル名、タイムスタンプ、権限や属性はファイルシステムで管理しているがMacは違うの?
ところで、list.sort()やalgorithmのsort条件を関数オブジェクト使って決めると思うが、
関数オブジェクトという言葉が通じない人が多い
operator()のオーバーロードってことではファンクタというほうがわかりやすいのだろうか?
0402デフォルトの名無しさん
2008/03/22(土) 14:22:24ちなみに自分はファンクタという言い方はあとで知った。
0403デフォルトの名無しさん
2008/03/22(土) 14:53:28コード上で関数のように使えるだけで、関数とは全く関係ないのに。
0404デフォルトの名無しさん
2008/03/22(土) 15:19:09やってることはエレガントだとは思う。
0405デフォルトの名無しさん
2008/03/22(土) 17:22:140406デフォルトの名無しさん
2008/03/22(土) 17:44:240407オガちゃん萌え ◆tyvkWCNtzY
2008/03/22(土) 20:16:13ファンクタを理解しているか?って言われれば、理解しきっていると言えるほど俺は自信ないw
Cの時によく使った関数ポインタのような、イベントハンドリングのロジックを外部化したり、コールバックなんか
に使うもんだという理解が強いかな
あとは、ポリモーフィズムとして同一で処理ロジックだけカスタマイズするときにファンクタとすることが多い
話は変わるが、組込み系ではメモリシステムをラップすることが多いとおもうが、
operator new()、operator delete()、operator new []()、operator delete []()なんかをオーバーロードするときは
EffectiveC++なんかを読み返してしまうよ…
メモリシステムといってそこでリークやオーバーフロー、未初期化アドレスアクセスなんかしてたら偉いことに
なってしまうし
そもそも、自分はC++、STLを理解しきっているとは思ってないよ
先週その典型例があった、C++といいつつCでマクロを書いたのだが、printf()をラップして可変引数をログ出力
するってやつ。stdarg.hの使い方を分かってなかったw
そういう>>402は?
0408デフォルトの名無しさん
2008/03/22(土) 20:22:45まあ、その関数をさらにマクロでラップしてるんだろうけど。
0409402
2008/03/22(土) 20:26:05「関数オブジェクトという言葉が通じない人は関数オブジェクトの存在を知らないから通じないんじゃない?」っていう意味です。
関数オブジェクトという用語を知らずに関数オブジェクトを使うかなあって思ったから。
自分も理解しきってないよ。簡単な関数オブジェクト作れるレベル。
0410デフォルトの名無しさん
2008/03/22(土) 20:51:000411デフォルトの名無しさん
2008/03/22(土) 23:17:29相談できる雰囲気でもないがね
0412デフォルトの名無しさん
2008/03/23(日) 00:44:28自分の胸に聞くのがはえーんじゃね?
0413デフォルトの名無しさん
2008/03/23(日) 01:03:59ひょっとして有名人?
関西でPGでかつどうしてんの?
0414デフォルトの名無しさん
2008/03/23(日) 01:10:460415オガちゃん萌え ◆tyvkWCNtzY
2008/03/23(日) 20:37:34ざらにいるんじゃないか、ファンクタを知らないPGは
だけど、今のPRJはユースケース駆動モデルでOOPかつAOP的コンセプトを多分に取り入れてる
から、ファンクタや関数オブジェクトの名前すら知らないようではさすがにPGとして使えない
デザインパターンの幾つかを理解しているくらいは最低求められる
とはいいつつも、知らずにそういうパターンを使っているってことは経験あるとおもうよ
大抵はライブラリとして用意されてるものを別途作って無駄なことやってることになるんだろうけどねw
>>410-412
まぁ固いこと言わないでマターリやろうよ
>>413
いや、有名人でもなんでもないよw
出身地は関西だが、都内で仕事してるしさ
>>414
オガちゃんいいよな!
0416オガちゃん萌え ◆tyvkWCNtzY
2008/03/23(日) 20:41:16可変引数を使うのにstdarg.hを使ったよ
va_start()やらはマクロを通して最終的にコンパイラ組込み型だからさ
ログ吐き用とはいえ、%SSっていう変なリテラルを敢えて作って、UTF-16の文字列をUTF-8(ASCII)
に変換してログ出しするってのを作ったわけなのだが、案外はまってしまったw
0417デフォルトの名無しさん
2008/03/24(月) 12:37:230418デフォルトの名無しさん
2008/03/27(木) 00:46:110419デフォルトの名無しさん
2008/04/16(水) 01:48:57newでいうbad_allocの例外をキャッチするような感じ。
0420デフォルトの名無しさん
2008/04/16(水) 02:12:07http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200112/01120006.txt
0421デフォルトの名無しさん
2008/04/16(水) 02:18:03な、なんだこの低レベルなやり取りは…
0423デフォルトの名無しさん
2008/04/16(水) 02:58:350424デフォルトの名無しさん
2008/04/16(水) 03:43:19アクセスバイオレーションになるのは有名な話だけどね。
0425デフォルトの名無しさん
2008/04/16(水) 07:17:170426デフォルトの名無しさん
2008/04/16(水) 08:01:170427デフォルトの名無しさん
2008/04/16(水) 20:34:00とでも言ってほしんだろうか
おまえらもっと仲良くしろよ
タダでさえ過疎ってんのに
0428デフォルトの名無しさん
2008/04/16(水) 21:03:38419の環境がどうとかじゃなくて。
0429デフォルトの名無しさん
2008/04/16(水) 22:01:51そんな微妙すぎるリンクを貼った>>420がまず意味不明。
>>424の内容はもっともだが、VC6世代なら誰でも知ってる常識レベル。
なぜあえてそこだけピックアップして言及したのか意味不明。
何にカチンと来たのか、その後の煽り合いも意味不明。
つまりお前ら全員意味不明。
0430デフォルトの名無しさん
2008/04/16(水) 22:17:11という流れを見ての、ちょっとした老婆心じゃね?
0431デフォルトの名無しさん
2008/04/17(木) 00:17:46要するに、君は色んなことの意味がことごとくわからない人、なわけだよね。
可哀相だけど、馬鹿につける薬って無いらしいから・・・合掌。
0432デフォルトの名無しさん
2008/04/17(木) 02:22:42今でもnothrowとかできるんだよとか
ちゃんと教えてやれよ
0433デフォルトの名無しさん
2008/04/17(木) 02:28:350434デフォルトの名無しさん
2008/04/17(木) 07:10:34だからこそ STL で >>424 が起こる訳だが。
0435デフォルトの名無しさん
2008/04/17(木) 07:23:43ま、煽りではあると思うよ、実際。
煽りと感じないことをアピールして煽り耐性自慢してもしょうがない。
0436デフォルトの名無しさん
2008/04/17(木) 19:15:490437デフォルトの名無しさん
2008/04/17(木) 20:11:210438デフォルトの名無しさん
2008/04/18(金) 11:08:290439デフォルトの名無しさん
2008/04/18(金) 11:12:050440デフォルトの名無しさん
2008/04/18(金) 12:20:530441デフォルトの名無しさん
2008/04/18(金) 18:48:430442デフォルトの名無しさん
2008/04/20(日) 12:21:420443デフォルトの名無しさん
2008/04/20(日) 12:47:470444デフォルトの名無しさん
2008/04/22(火) 13:36:500445デフォルトの名無しさん
2008/04/22(火) 13:42:020446デフォルトの名無しさん
2008/04/22(火) 14:58:190447デフォルトの名無しさん
2008/04/22(火) 15:09:25それもある意味整合性があると言える気がする。
0448デフォルトの名無しさん
2008/04/22(火) 20:57:09片方のmapにもう片方のmapの要素を全部移動する方法ってありませんか?
swapみたいにコピーしないで済む方法があればいいんですが。
0449デフォルトの名無しさん
2008/04/22(火) 23:28:330450デフォルトの名無しさん
2008/04/22(火) 23:29:250451デフォルトの名無しさん
2008/04/22(火) 23:38:01450さんの言われたとおりです。
限定的にしか使わないクラスをsecondにしてるので
operator=オーバーライドしてコスト下げるしかないかなぁとは思っています。
Boostとかであればそれでもいいんですが。
0452デフォルトの名無しさん
2008/04/22(火) 23:39:45実体はリストに保持しておくとか。
0453デフォルトの名無しさん
2008/04/29(火) 01:25:040454デフォルトの名無しさん
2008/05/05(月) 17:27:47MyIterator it;
*it = 'A';
これは、何がいけないんでしょうか?
0455デフォルトの名無しさん
2008/05/05(月) 17:38:17*p=0;
これのどこがいけないと思いますか?
0456デフォルトの名無しさん
2008/05/05(月) 17:44:160457デフォルトの名無しさん
2008/05/05(月) 17:58:260458側近中の側近 ◆0351148456
2008/05/05(月) 18:03:57(っ´▽`)っ
itの記憶領域確保しろよ☆
it = new MyIterator('A');
かな?
0459デフォルトの名無しさん
2008/05/05(月) 18:11:050460デフォルトの名無しさん
2008/05/05(月) 18:13:01そういう問題じゃないだろ
そもそもstd::iterator<>はインスタンスを作ることを意図したクラスじゃないし、
operator*も定義されてない
0461デフォルトの名無しさん
2008/05/05(月) 18:19:39いや、阿呆なのは458だけでしょ。
>455の例えはよくわかる。
0462デフォルトの名無しさん
2008/05/05(月) 18:23:110463側近中の側近 ◆0351148456
2008/05/05(月) 18:23:46(っ´▽`)っ
そうだよ。(っ´▽`)っがヴァカなだけだよ
0464側近中の側近 ◆0351148456
2008/05/05(月) 18:26:04だってC++よくわからないんだも〜ん☆
0465デフォルトの名無しさん
2008/05/05(月) 18:26:070466デフォルトの名無しさん
2008/05/05(月) 19:29:39じゃあ、どんな動作を期待しているのか述べてみよう。
0467デフォルトの名無しさん
2008/05/05(月) 20:51:15胴囲
0468デフォルトの名無しさん
2008/05/07(水) 21:58:26何が言いたいの?
0469デフォルトの名無しさん
2008/05/07(水) 22:01:40わかりやすくポインタで例えてやろうかあぁ?
0470デフォルトの名無しさん
2008/05/08(木) 06:00:33std::iterator<>はそもそもイテレータじゃないんだから
0471デフォルトの名無しさん
2008/05/08(木) 07:23:470472デフォルトの名無しさん
2008/05/08(木) 11:49:01肝心のガンダムがない
0473デフォルトの名無しさん
2008/05/08(木) 12:48:040474デフォルトの名無しさん
2008/05/08(木) 12:49:07どういう動作をさせるためにどうやって使いたいのかわからない。
0475デフォルトの名無しさん
2008/05/08(木) 14:19:39const char * にNULLを渡すか空文字を渡すかで動作が違う関数があると、
それをstd::stringでラップするときに微妙に困るじゃない。
0476デフォルトの名無しさん
2008/05/08(木) 14:36:200477デフォルトの名無しさん
2008/05/08(木) 15:07:11class my_string : public std::string {
bool m_is_null;
public:
my_string() : m_is_null(true) {}
operator=(const char* p) { if (p==NULL) set_null() else set_string(p); }
operator=(const std::string& s) { set_string(s); }
void set_null() { m_is_null = true; clear(); }
void set_string(const std::string& s) { m_is_null = false; *this = s; }
bool is_null() { return m_is_null; }
}
0478デフォルトの名無しさん
2008/05/08(木) 19:30:54実は同じのを作って使ってるんだ。でもありがとう。
0479デフォルトの名無しさん
2008/05/08(木) 19:58:460480デフォルトの名無しさん
2008/05/08(木) 20:02:34template <class T> Nullable : public T
{
...
};
などしておいてはどうだろうか
0481デフォルトの名無しさん
2008/05/08(木) 20:14:250482デフォルトの名無しさん
2008/05/08(木) 20:16:280483デフォルトの名無しさん
2008/05/08(木) 20:16:430484デフォルトの名無しさん
2008/05/08(木) 20:26:280485デフォルトの名無しさん
2008/05/08(木) 20:42:080486デフォルトの名無しさん
2008/05/08(木) 21:01:000487デフォルトの名無しさん
2008/05/08(木) 21:33:020488デフォルトの名無しさん
2008/05/08(木) 22:14:230489デフォルトの名無しさん
2008/05/09(金) 01:12:470490デフォルトの名無しさん
2008/05/09(金) 02:04:55nullの存在がうっとおしいと思うときがあるから不思議。
0491デフォルトの名無しさん
2008/05/09(金) 07:19:300492デフォルトの名無しさん
2008/05/09(金) 08:13:15そうそう、無効値としてnullか""のどちらにするか結構悩む。
0493デフォルトの名無しさん
2008/05/09(金) 11:55:380494デフォルトの名無しさん
2008/05/09(金) 13:04:180495デフォルトの名無しさん
2008/05/09(金) 13:06:26気にしないで・・・。
0496デフォルトの名無しさん
2008/05/09(金) 13:17:01typedefしかしてないクラスだから、public継承しないと意味無いと思うけど。
0497デフォルトの名無しさん
2008/05/09(金) 15:25:34class my_iterator : private std::iterator<Tag, Type> {
typedef std::iterator<Tag, Type> super_t;
public:
using super_t::iterator_category;
using super_t::value_type;
using super_t::difference_type;
using super_t::pointer;
using super_t::reference;
};
0498デフォルトの名無しさん
2008/05/09(金) 18:20:17protected な非仮想デストラクタが定義されていればいいのに。
0499デフォルトの名無しさん
2008/05/09(金) 18:23:23自分が何言ってるかわかってるのかw
0500デフォルトの名無しさん
2008/05/09(金) 18:53:04いいじゃないの?
0501デフォルトの名無しさん
2008/05/09(金) 19:07:08何もいいこと無いからな
0502デフォルトの名無しさん
2008/05/09(金) 19:56:400503デフォルトの名無しさん
2008/05/09(金) 20:22:33C++ Coding Standardsの50項目目に紹介されている。
0504デフォルトの名無しさん
2008/05/09(金) 20:30:15で提案している人がいますね。
反論もあるようです。
0505デフォルトの名無しさん
2008/05/09(金) 21:04:170506デフォルトの名無しさん
2008/05/09(金) 21:04:560507505
2008/05/09(金) 21:13:020508デフォルトの名無しさん
2008/05/10(土) 02:18:22ここを見て、stringのメンバ関数findの実装が知りたいと思い、
stringファイルの中を検索してみたんですが見つかりません(環境はVC2008EE)。
find関数は廃止されちゃったんですか?
0509デフォルトの名無しさん
2008/05/10(土) 02:27:120510508
2008/05/10(土) 02:36:53xstringファイルに定義されていました。
インクルードの経路が複雑・・・。
0511デフォルトの名無しさん
2008/05/10(土) 11:21:32>ほとんどの台は左第一停止で引き込み100%だったっしょ。(チェリーバーは順押しで引き込み100%)
いや、だから「すげー細かい」ってことだったんで・・・
スーパーヘビーメタルについては「リプor緑/リプ/リプ」がJacInなんで引き込み100%かと・・・
http://www.pachinko-club.com/gallery/kisyu.php?id=603803
ミラクルUFOに関してはわからず・・・
>初BET枚数の異なる2種類ボーナス △ デビルメイクライ3 ロデオ 4種類REGの内、1つが1枚、他は2枚
リオパラダイスがBIG/REGでBET枚数違ったような・・・(リオが3月でDMCが6月)
0512デフォルトの名無しさん
2008/05/10(土) 12:34:560513デフォルトの名無しさん
2008/05/10(土) 15:50:420514デフォルトの名無しさん
2008/05/10(土) 19:18:19うちらも外から見たら同じなんだろうけど
0515デフォルトの名無しさん
2008/05/10(土) 22:31:28> うちらも外から見たら同じなんだろうけど
むかしガイドライン板に「一度も行ったことない板に行ってみるスレ」ってのがあって、
この板を覗いた奴の感想は「わけわからん。半分ぐらい日本語じゃない」だったなw
0516デフォルトの名無しさん
2008/05/10(土) 23:07:22まぁ、俺はこの板の内容も半分以上わからんが
0517デフォルトの名無しさん
2008/05/11(日) 02:54:050518デフォルトの名無しさん
2008/05/13(火) 01:01:43STLをかじり始めの者なのですが、質問があります。
std::ofstreamだのstd::wofstreamだのをいじってみたのですが、
どうしてもユニコードでファイル出力ができません。
std::setlocale("japanese")とやってみると、どうやらshift-jisの
テキストが出力されてしまうみたいなんですが・・・。
STLを利用してユニコードのテキストファイルを出力するには
どうすればいいのでしょうか?よろしくお願いします。
ちなみにVC9を使用しております。
0519デフォルトの名無しさん
2008/05/13(火) 01:28:34ストリームをテキストモードで開いているとUnicodeからANSIへの変換が暗黙のうちに行われます。
バイナリモードで開くとこの変換は行われません。
0520デフォルトの名無しさん
2008/05/13(火) 02:03:530521デフォルトの名無しさん
2008/05/13(火) 02:08:04VC限定ならpubsetbufで大丈夫なはず。
http://msdn.microsoft.com/en-us/library/tzf8k3z8.aspx
ただしVCのバージョンによっても挙動が違ったはず。
binaryでも大丈夫になったのかな?
最終手段としてはwchar_t*をchar*に無理やりキャストして書き込むとか。
0522518
2008/05/13(火) 03:33:12>>520
>>521
のみなさん、返答ありがとうございました。バイナリで書き込まない
といけなかったのですね・・・。>>521さんの貼り付けてくれたサンプル
コードでなんとか分かりました。やっとUTF-16のテキストファイルを
作成することができました。ありがとうございました。
0523デフォルトの名無しさん
2008/05/13(火) 08:40:07システムがサポートする文字コード全て、パラメータ指定するだけで出力出来るんだけどね。
0524デフォルトの名無しさん
2008/05/13(火) 08:57:050525デフォルトの名無しさん
2008/05/13(火) 15:10:110526デフォルトの名無しさん
2008/05/13(火) 15:18:480527523
2008/05/13(火) 18:58:21パラメータとして文字コードを追加していするだけでいいんだけどね。
0528デフォルトの名無しさん
2008/05/13(火) 19:13:270529518
2008/05/15(木) 21:06:15その後、いろいろと読み漁ってみた結果、上記のままの理解では、
このスレを読んでいる、同じ疑問を持った人に、無用な誤解を与える
恐れがあるかも知れないので、分かったことを書いておきます。
std::fstreamなどのストリームの文字コードの自動変換は
std::localeクラスの中にあるファセット(文字セット間の変換、通貨、日付と時刻
などの地域化を司るクラス)と呼ばれる部分で行っているらしいです。
で、文字コード変換を司るファセットはcodecvtと呼ばれており、自分の望んだ
文字コードに変換したい場合は、codecvtの派生クラスを作成するのが、
本来のやり方のようです。で、こんなもんを自分で書くのがよいのか、それとも
既に誰かが書いていて、それを利用できるようになっているのか、というところ
までは、まだよく分かっていません。
http://imt.uni-paderborn.de/download/solaris/Sun_Studio_11/CD1/kits/ide/packages/SPJAhtstd/reloc/SUNWspro/prod/lib/locale/ja/html/manuals/stdlib/user_guide/loc_io/3_2.htm
http://d.hatena.ne.jp/Cryolite/searchdiary?word=*%5BLocale%5D
http://docs.sun.com/source/820-2985/loc_io/19_2.htm
大変お騒がせしました。これにて失礼します・・・。
0530デフォルトの名無しさん
2008/05/15(木) 23:15:51一般のライブラリでの実装と言えばそれくらいしか知らないけど。
0531デフォルトの名無しさん
2008/05/21(水) 21:31:09ご意見で結構なので、よろしくお願いします。
@eraseで、listから登録しているクラスのポインタを削除した場合に、
→リストから削除したクラスのデストラクタはコールされる?
リストから要素のみ削除されると理解していたのですが、
VC6.0のSTLのドキュメントを読んだところ、
N回のeraseでN回のデストラクタが呼ばれると書いてあったため困惑中。
Aマルチスレッドアプリでコンテナなどを用いるのは危険?(VC6.0を想定)
→MSDNにて、eraseを複数のスレッドから同時に実行するとデッドロックする
という記載等があったため、少なくともVC6.0のSTLは
マルチスレッドアプリを作る上で適当でないと思い始めている段階。
実際、beginなどの引数なし関数コール時にアプリが落ちた経緯あり
0532デフォルトの名無しさん
2008/05/21(水) 21:37:54こういう日本語もワカル人がいるので不思議
そういう人を待て
0533デフォルトの名無しさん
2008/05/21(水) 21:41:21std::list<T*>なら、該当するオブジェクトとはlistの要素たるT*のオブジェクトであり、
T自体のデストラクタは呼ばれない。
Tオブジェクトのデストラクタが呼ばれるようにしたければ、
boost::shared_ptrでも使えというのがC++の現状。
0534デフォルトの名無しさん
2008/05/21(水) 21:42:411. について
ポインタ要素を erase してもデストラクタは呼ばれません。
実体を格納している場合には erase でデストラクタが呼ばれます。
2. について
読み取り専用なら安全です。更新があるなら、明示的に排他制御
しましょう。
0535デフォルトの名無しさん
2008/05/22(木) 00:29:50回答ありがとうございます。
概ね、当方の理解と一致しており、胸を撫で下ろしました。
質問事項Aのマルチスレッドでの使用に関しては、
別スレッドでswap/uniqeなどで
iterator iの参照先の内容が変わることを考慮すると、
begin等も容易には使えないですね。
ちなみに、今、他人のソースをレビュー中でして、
人のソースを見ていると、自分の理解が正しいのかどうか
ちょっと不安になってきたりと・・・oTL
0536デフォルトの名無しさん
2008/05/22(木) 01:10:30unique後はそもそもイテレータが無効になるから、マルチスレッド以前の問題だね。
0537デフォルトの名無しさん
2008/05/22(木) 01:33:51スレッド安全性については規格では何も規定していないから、実装ごとにドキュメントを
読む必要がある。ドキュメントに記載がなければ、同時アクセスは一切できないものと
考えたほうがいい。そういう実装もあるので、最大限の移植性が必要なら同時アクセスは
一切できないものと考えるべき。
0538デフォルトの名無しさん
2008/05/22(木) 12:03:22あとポインタ格納しつつeraseしてもデストラクトする実装ならboost::ptr_listってのがある
0539デフォルトの名無しさん
2008/05/22(木) 20:39:50自分もそうおもふ
0540デフォルトの名無しさん
2008/05/22(木) 21:56:49http://msdn.microsoft.com/en-us/library/c9ceah3b.aspx
あるオブジェクトについて、同時読取り可、単一スレッドの書込み可。
同時書込みや読み書き同時は不可。
スレッドごとに別のオブジェクトを読み書きするのは問題ない。
例外的にストリーム出力は同時書込み可。
0541デフォルトの名無しさん
2008/05/22(木) 22:19:18コンパイル時に全部展開されるので多用する場合はメモリを無駄に消費しそうなんですが、
比較的大規模なアプリを作るときは、やはりコンパイル済みのライブラリを使うべきなんでしょうか?
例えばMFCとSTLはどのように使い分けるのが賢いんでしょうか。
0542デフォルトの名無しさん
2008/05/22(木) 22:48:06なので、規模が大きくなるほどテンプレートのオーバーヘッドの割合は減少すると思う
MFCとSTLでは重複するのはコンテナくらい
コンテナはSTLの方が大分出来が良いので、基本的にコンテナはSTLのを使えば良いと思う
MFCにべったり近い処理をするときなどは専用のコンテナが使いやすいこともあるかもしれない
結局はケースバイケースかな
0543デフォルトの名無しさん
2008/05/22(木) 23:08:54重複除去は仕様。必ず行われる。
0544デフォルトの名無しさん
2008/05/22(木) 23:22:410545デフォルトの名無しさん
2008/05/23(金) 06:04:20例えば CODE セグメントとか .text セクションが 10 倍になって困るのか?
一割り増しでも困るなら、使うのをやめというたほうがいいだろう。
なんというか、なんでもいいから毎月雑誌読もう。二年もするとだいぶ変わる。
0546デフォルトの名無しさん
2008/05/23(金) 07:27:130547デフォルトの名無しさん
2008/05/23(金) 12:17:37さらに酷いとコンパイラやリンカが落ちる。
STLレベルならそこまでのことにはならないが、テンプレートの副作用だな。
0548デフォルトの名無しさん
2008/05/23(金) 12:21:040549デフォルトの名無しさん
2008/05/23(金) 23:25:010550デフォルトの名無しさん
2008/05/24(土) 09:26:13たとえば、こんな風にバッファとして直接vectorに値を書き込むのはvectorの使い方として適切?
std::vector<char> TestV;
TestV.resize(MAX_PATH);
::GetCurrentDirectory(TestV.size(),&(TestV[0]));
std::cout<<&(TestV[0])<<"\n";
0551デフォルトの名無しさん
2008/05/24(土) 09:27:320552デフォルトの名無しさん
2008/05/24(土) 09:43:05vectorの内部バッファの連続性は規格で保証されているのでok
>>551
現時点ではstringの内部バッファの連続性は保証されてなかった気がする。
0553デフォルトの名無しさん
2008/05/24(土) 09:44:54まあいいや。
0554デフォルトの名無しさん
2008/05/24(土) 09:54:28そんなコードさわりたくねえ
0555デフォルトの名無しさん
2008/05/24(土) 09:57:500556デフォルトの名無しさん
2008/05/24(土) 10:24:53std::cout<<str<<std::endl;
とでも書かないと満足できない人なんだよ、きっと。
0557デフォルトの名無しさん
2008/05/24(土) 17:11:20「まぁいい」って、>>551を書いた根拠がまさにそれで、
立場が無くなって言葉濁してるだけでしょ?w
0558デフォルトの名無しさん
2008/05/24(土) 18:17:310559デフォルトの名無しさん
2008/05/24(土) 18:31:260560デフォルトの名無しさん
2008/05/24(土) 18:39:250561デフォルトの名無しさん
2008/05/24(土) 20:31:27とか言いたいのかな
0562デフォルトの名無しさん
2008/05/24(土) 21:31:080563デフォルトの名無しさん
2008/05/24(土) 22:13:29C++0x
0564デフォルトの名無しさん
2008/05/25(日) 23:33:582箇所でSTLを取り入れただけで、.libのファイルサイズが3倍になったんだけど
テンプレート導入でサイズ急膨張って常識なんすか?
0565デフォルトの名無しさん
2008/05/26(月) 00:08:320566デフォルトの名無しさん
2008/05/26(月) 00:27:480567デフォルトの名無しさん
2008/05/26(月) 00:28:44デバッグ情報じゃねーの?
0568デフォルトの名無しさん
2008/05/26(月) 02:42:073MByteが9MByteになったとかだったら、なにやったんだよと思う。
0569デフォルトの名無しさん
2008/05/26(月) 02:46:150570デフォルトの名無しさん
2008/05/26(月) 10:31:540571デフォルトの名無しさん
2008/05/26(月) 12:38:030572デフォルトの名無しさん
2008/05/26(月) 12:50:120573デフォルトの名無しさん
2008/05/27(火) 21:44:52そこは &TestV.front() だろ・・・常考。
0574デフォルトの名無しさん
2008/05/28(水) 02:04:010575デフォルトの名無しさん
2008/05/28(水) 22:48:49class ListEx
{
list<T> m_list;
list<T>::iterator m_itr;
};
iterator の行でエラーになります。
何がいけないのでしょうか?
0576デフォルトの名無しさん
2008/05/28(水) 22:52:470577デフォルトの名無しさん
2008/05/28(水) 22:57:16ありがとうございます
エラーは出なくなりました。
でも、 typename がなぜ必要なのかわかりません。
どこを調べたらいいのでしょうか?
0578デフォルトの名無しさん
2008/05/28(水) 23:14:34一度、Effective STLを読んでおいた方がいいんじゃないか?
0579デフォルトの名無しさん
2008/05/28(水) 23:20:22http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=C%2B%2B+template+typename&num=50
0580デフォルトの名無しさん
2008/05/28(水) 23:22:34とコンパイラが怒るから
0581デフォルトの名無しさん
2008/05/29(木) 10:23:160582デフォルトの名無しさん
2008/05/29(木) 10:31:120583デフォルトの名無しさん
2008/05/29(木) 11:24:32だったらlist<T>::iteratorをする時にはtypenameの代わりに何が必要なのか
0584デフォルトの名無しさん
2008/05/29(木) 12:45:15何もいらない。
typenameがないときは、暗黙のうちに値として扱われるよ。例外もあるけど。
0585デフォルトの名無しさん
2008/05/29(木) 12:50:33実際VC++だとtypename無くても通るっぽい?
賢いというよりテンプレート宣言を読むときは「あーはいはい」って感じで
実際に型当てはめてからチェック開始してるのかね
0586デフォルトの名無しさん
2008/05/29(木) 19:36:19なるほど、
typename list<T>::iterator m_iter;
は list<T>::iterator がタイプ名だとコンパイラに教えているのか
やっと納得できた
0587デフォルトの名無しさん
2008/05/30(金) 01:04:100588デフォルトの名無しさん
2008/05/30(金) 02:06:070589デフォルトの名無しさん
2008/05/30(金) 02:43:430590デフォルトの名無しさん
2008/05/30(金) 22:33:280591デフォルトの名無しさん
2008/05/30(金) 22:40:10つTechnical Report 1
0592デフォルトの名無しさん
2008/05/31(土) 01:30:22STL辺りに「テーブルクラス」なんてありますか?
イメージとしては、データベースのテーブルをオブジェクトとして扱うクラスです。
result = DBDATA.summary(var1) ;
こんな感じです。
0593デフォルトの名無しさん
2008/05/31(土) 02:36:59EffectiveC++の第三版はtr1にちょっと触れてる
0594デフォルトの名無しさん
2008/05/31(土) 07:56:28イメージとしては、データベースのテーブルをオブジェクトとして扱う
クラスはない感じです。
0595デフォルトの名無しさん
2008/05/31(土) 12:12:08STLだけでやるなら、連想系コンテナとアルゴリズムを組み合わせる感じかね。
0596デフォルトの名無しさん
2008/05/31(土) 12:19:01とりあえずboost本買ってみるのは
0597デフォルトの名無しさん
2008/05/31(土) 14:49:33where句が限定されているならmapでいいんじゃないの?
っていうかDB的に使うなら普通にsqliteでも使った方が無難だよ。
0598デフォルトの名無しさん
2008/05/31(土) 15:20:14DataSetとか
0599デフォルトの名無しさん
2008/06/03(火) 22:37:030600デフォルトの名無しさん
2008/06/03(火) 22:38:010601デフォルトの名無しさん
2008/06/03(火) 22:40:260602デフォルトの名無しさん
2008/06/03(火) 23:09:110603デフォルトの名無しさん
2008/06/03(火) 23:43:37死ねって言われた奴は
死ねばいいのに
0604デフォルトの名無しさん
2008/06/03(火) 23:59:170605デフォルトの名無しさん
2008/06/04(水) 00:06:560606デフォルトの名無しさん
2008/06/04(水) 01:00:470607デフォルトの名無しさん
2008/06/04(水) 08:44:190608デフォルトの名無しさん
2008/06/04(水) 08:45:300609デフォルトの名無しさん
2008/06/04(水) 13:11:39木を追跡したいんですが、そういうことは可能でしょうか?
0610デフォルトの名無しさん
2008/06/04(水) 13:13:10アルゴリズムの本読んでみ
0611デフォルトの名無しさん
2008/06/04(水) 13:17:24std::map が木で実装されているとは限らないので、そういう操作は無い。
木の追跡(?)自体がやりたいわけじゃないと思うんだけど、結局のところ何がしたいの?
0612デフォルトの名無しさん
2008/06/04(水) 13:26:33upper/lower_boundで解決しました。
0613デフォルトの名無しさん
2008/06/04(水) 13:36:390614デフォルトの名無しさん
2008/06/04(水) 13:41:170615デフォルトの名無しさん
2008/06/04(水) 14:21:170616デフォルトの名無しさん
2008/06/04(水) 14:23:030617デフォルトの名無しさん
2008/06/04(水) 15:05:120618デフォルトの名無しさん
2008/06/04(水) 15:18:030619デフォルトの名無しさん
2008/06/04(水) 15:46:50頭が悪いかジジイかのどちらかだろう
0620デフォルトの名無しさん
2008/06/04(水) 16:07:29vector<vector<bool>> TempA;
vector<vector<bool>>::iterator itr1;
vector<vector<bool>>::iterator itr2;
と宣言したとします。
itr1 = TempA.begin();
itr2 = TempA.begin();
としたのち、
TempAのたとえば2行目と3行目の中身すべてを比較したいとき、
itr1++;itr2 += 2;としてiteratorを進めて、
*itr1 == *itr2の比較を一度行えばいいのでしょうか?
それとも、各行でiteratorを作成して、
各行ベクトルの列座標に対応したiteratorを回す必要がありますか?
p.s.この動作のあと、一致している行を、
itr2=Temp.erase(itr2);
みたいに削除したいのです。
0621デフォルトの名無しさん
2008/06/04(水) 16:34:38要するに二つのvectorを==で比較できるかってことだよな
できるよ
0622デフォルトの名無しさん
2008/06/04(水) 16:46:22ありがとうございます。
行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。
0623デフォルトの名無しさん
2008/06/04(水) 18:17:130624デフォルトの名無しさん
2008/06/04(水) 18:19:4023.1 Container requirements に
a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin())
と等価と書いてある。
0625デフォルトの名無しさん
2008/06/04(水) 22:12:31map使わずにソート済vector使えばいいんじゃね?
0626620
2008/06/05(木) 10:43:24亀レス申し訳ない。
ありがとうございました。
そういう情報ってどのヘッダーを見ればいいんでしょうか?
vector.hを眺めていてもさっぱりです…。
0627デフォルトの名無しさん
2008/06/05(木) 11:34:56ヘッダーには書いてないだろう・・・
お使いのコンパイラのリファレンスマニュアル等を読め
VCならこのへん↓
http://msdn.microsoft.com/en-us/library/5asks2ba(VS.80).aspx
0628デフォルトの名無しさん
2008/06/05(木) 13:25:16C++の規格書一回読んでみるのもいい。
0629デフォルトの名無しさん
2008/06/05(木) 20:20:370630デフォルトの名無しさん
2008/06/06(金) 10:17:16自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。
0631デフォルトの名無しさん
2008/06/06(金) 10:22:06戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。
0632デフォルトの名無しさん
2008/06/06(金) 10:36:05それは実装側のbegin, endの定義ですよね?
自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、
これは利用する側が呼び出すときには特に関係ない様です。
まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)();
なんてしなきゃいけないんですか?
0633デフォルトの名無しさん
2008/06/06(金) 11:24:470634デフォルトの名無しさん
2008/06/06(金) 11:27:590635デフォルトの名無しさん
2008/06/06(金) 11:31:44constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん
0636デフォルトの名無しさん
2008/06/06(金) 12:59:04template<class _Ty,class _Alloc>
class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>
0637デフォルトの名無しさん
2008/06/06(金) 19:44:07補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。
constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。
begin()の戻り値を渡す先がconst_iteratorかiteratorかで、
begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。
0638デフォルトの名無しさん
2008/06/06(金) 22:14:29MyContainer c = ...
MyContainer const& cc = ...
MyContainer::const_iterator = c.begin();
MyContainer::const_iterator = cc.begin();
これをトレースするといいよ。
0639デフォルトの名無しさん
2008/06/07(土) 00:30:210640デフォルトの名無しさん
2008/06/07(土) 13:26:16非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。
0641デフォルトの名無しさん
2008/06/13(金) 20:31:07char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが
string って \n とかとは別に改行とかタブコードがあるんでしょうか?
0642デフォルトの名無しさん
2008/06/13(金) 20:40:550643641
2008/06/13(金) 21:37:36エディットコントロールのマルチラインがFalseなだけだった
俺市ねw
0644デフォルトの名無しさん
2008/06/13(金) 22:13:130645デフォルトの名無しさん
2008/06/13(金) 22:49:25今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。
0646デフォルトの名無しさん
2008/06/14(土) 12:34:340647デフォルトの名無しさん
2008/06/14(土) 15:25:440648デフォルトの名無しさん
2008/06/14(土) 15:30:120649デフォルトの名無しさん
2008/06/14(土) 15:31:250650デフォルトの名無しさん
2008/06/14(土) 15:36:290651デフォルトの名無しさん
2008/06/14(土) 15:39:16シングルトンのややこしさがよく分かる。
Scala みたいに言語的にサポートしてくれればいいんだが。
0652デフォルトの名無しさん
2008/06/14(土) 15:48:110653デフォルトの名無しさん
2008/06/14(土) 15:53:210654デフォルトの名無しさん
2008/06/14(土) 15:58:26newしたら自動的に今あるインスタンスが削除されるシングルトン
0655デフォルトの名無しさん
2008/06/14(土) 16:51:25使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。
0656デフォルトの名無しさん
2008/06/14(土) 16:59:250657デフォルトの名無しさん
2008/06/14(土) 18:36:280658デフォルトの名無しさん
2008/06/14(土) 18:37:220659デフォルトの名無しさん
2008/06/14(土) 19:42:54比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、
これと同じ様に一致関数をテンプレート引数で指定できませんか?
0660デフォルトの名無しさん
2008/06/14(土) 19:45:23!lt(x, y) && !lt(y, x)
で一致判定してる
0661デフォルトの名無しさん
2008/06/14(土) 19:46:43!(a < b) && !(b < a) なら a と b は一致していることになる
0662デフォルトの名無しさん
2008/06/14(土) 20:12:240663デフォルトの名無しさん
2008/06/14(土) 22:07:440664デフォルトの名無しさん
2008/06/15(日) 09:53:590665デフォルトの名無しさん
2008/06/15(日) 10:08:080666デフォルトの名無しさん
2008/06/15(日) 15:05:30複数のスレッドからイテレータ取得してアクセスしたりするなら
シグナルやミューテクスでロックしてからアクセスするべきですか?
0667デフォルトの名無しさん
2008/06/15(日) 15:10:460668デフォルトの名無しさん
2008/06/15(日) 15:16:56実装次第。
各処理系のマニュアルを読むよう。
0669デフォルトの名無しさん
2008/06/15(日) 15:29:140670デフォルトの名無しさん
2008/06/17(火) 20:02:100671デフォルトの名無しさん
2008/06/17(火) 20:04:490672デフォルトの名無しさん
2008/06/17(火) 20:09:480673デフォルトの名無しさん
2008/06/17(火) 21:24:550674デフォルトの名無しさん
2008/06/17(火) 21:43:270675デフォルトの名無しさん
2008/06/17(火) 21:54:490676デフォルトの名無しさん
2008/06/17(火) 22:07:350677デフォルトの名無しさん
2008/06/17(火) 22:15:170678デフォルトの名無しさん
2008/06/18(水) 02:26:330679デフォルトの名無しさん
2008/06/18(水) 22:08:47あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど
実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。
0680デフォルトの名無しさん
2008/06/18(水) 22:22:490681デフォルトの名無しさん
2008/06/18(水) 22:35:13ありがとう。
0682デフォルトの名無しさん
2008/06/20(金) 15:05:13みたいなインスタンスをシリアライズ化したいんですけど、単純に
FILE *fp = fopen("vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);
みたいに書き込めば良いんですかね?
そして戻すときは、逆に
std::vector<std::string> v1;
char* buf = (char*)&v1;
FILE *fp = fopen("vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);
みたいな感じでいいんですかね?
STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。
0683デフォルトの名無しさん
2008/06/20(金) 15:33:55オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう
0684デフォルトの名無しさん
2008/06/20(金) 15:38:380685デフォルトの名無しさん
2008/06/20(金) 15:46:360686デフォルトの名無しさん
2008/06/20(金) 16:45:27とりあえずこれが動けば十分です。
std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);
std::vector<std::string> v2;
char* buf = (char*)&v2;
fopen_s(&fp, "vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);
0687デフォルトの名無しさん
2008/06/20(金) 16:53:25まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。
終了時に2重解放でエラーになってないか?
0688デフォルトの名無しさん
2008/06/20(金) 16:54:48何がいけないんだろう・・・
0689デフォルトの名無しさん
2008/06/20(金) 16:58:00(ついでにstringもな)
fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、
ポイント先は保存されないんだよ。
0690デフォルトの名無しさん
2008/06/20(金) 17:00:54どうすればいいでしょうか。
やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、
それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、
初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。
0691デフォルトの名無しさん
2008/06/20(金) 17:04:45ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。
ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。
そこまでするなら配列でやります。
0692デフォルトの名無しさん
2008/06/20(金) 17:10:080693デフォルトの名無しさん
2008/06/20(金) 17:11:11std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
const char *pstr;
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
for(size_t c=0, e=v1.size(); c < e; c++) {
pstr = v1[c].c_str();
fwrite(pstr, strlen(pstr), 1, fp);
}
fclose(fp);
0694デフォルトの名無しさん
2008/06/20(金) 17:21:42書き込み
std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
size_t size;
for(size_t c=0, e=v1.size(); c < e; c++) {
size = v1[c].size();
fwite(&size, sizeof(size), 1, fp);
fwrite(v1[c].c_str(), size, 1, fp);
}
fclose(fp);
0695デフォルトの名無しさん
2008/06/20(金) 17:28:10std::vector<std::string> v2;
FILE *fp;
fopen_s(&fp, "vec.bin", "rb");
size_t size;
fread(&size, sizeof(size), 1, fp);
v2.resize(size);
for(size_t c=0, e=size; c < e; c++) {
fread(&size, sizeof(size), 1, fp);
v2[c].resize(size);
fread(&v2[c][0], size, 1, fp);
//stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が
//あるが、vcなら問題ないので省略
}
fclose(fp);
0696デフォルトの名無しさん
2008/06/20(金) 17:33:26//保存
{
vector<string> data;
data.push_back("Hello");
data.push_back("World");
ofstream file("save.dat");
boost::archive::text_oarchive oa(file);
oa << (const vector<string>&) data;
}
// 復元
{
vector<string> data;
ifstream file("save.dat");
boost::archive::text_iarchive ia(file);
ia >> data;
}
下準備がちょっと面倒だけどな。
興味あったら下記を参照してください。
ttp://www.kmonos.net/alang/boost/classes/serialization.html
0697デフォルトの名無しさん
2008/06/20(金) 17:48:04やっぱり要素ごとにサイズと一緒に保存という形しかないんでしょうか。
私のイメージではシリアライズというと、メモリ上にあるオブジェクトの塊を
そのままバイナリで一気に書き込むという感じで、だからこそ高速化に役立つと思うのです。
要素ごとに書き込んでいると、カンマ区切りのケースとそれほど時間の差が出ないような・・・
MFCのCObjectを継承したクラスはシリアライズができますが、それはおそらく、
オブジェクトのデータやステートをメモリ空間上で一塊になるようにしている配置しているからこそ
できるんじゃないかと思います。
STLではどうもそういう仕組みはないようなので、保存や復元に時間がかかるのは無理ないんでしょうかね。。。
>>696
boostの場合はどうなんでしょうか。
保存と復元を高速化できるかどうかがキモなんです。
0698デフォルトの名無しさん
2008/06/20(金) 17:55:59カンマ区切りの文字列の読み込みに、そんなに時間がかかるとは思えんが。
時間がかかっているのはパースよりもvectorの伸張だろう。
先にカンマの数をカウントしてvector.reserve()するとか、vectorではなくて
dequeにするとかの方が速くなるかと。
0699デフォルトの名無しさん
2008/06/20(金) 18:06:48MFCのシリアライズは、各メンバをひとつずつCArchiveに書き込んでたと思うよ
CObjectを継承すれば自動的にサポートされるものでもなく、メンバをひとつずつ書き込むコードを各クラスに個別に実装する必要があった
シリアライズに対するそのイメージは誤りかと
0700デフォルトの名無しさん
2008/06/20(金) 18:31:32まずデータ構造自体から見直すべきだろ。
というか、そこがネックになってる時点で何かが間違ってる。
0701デフォルトの名無しさん
2008/06/20(金) 18:44:43そうなんですか。
可変長データ配列のオブジェクトの保存と復元を高速化するためには、
各自が工夫して実装するしかないんですかね。
なんか車輪の再発明のような気が・・・
配列要素の変更・追加・削除は頻繁にはやらないので、そちらの時間コストは多少増えてもいいんです。
とにかくソフトの起動をコンマ1秒でも速くするために、ドカンと一気に読み込めるようにしたいんですよね。
BYTE型配列1本と、ポインタ・サイズを格納した配列の計2本で、
そういったことをやれそうなイメージはあります。
0702デフォルトの名無しさん
2008/06/20(金) 18:45:42しなければならないのは仕方が無い。
また、上の例でも1文字ずつカンマをチェックしながらアクセスするよりは、
単純に数倍は速いよ。
ディスクアクセスが気になってるのなら、あらかじめメモリ上に
直列化して、総サイズも一緒に書き込むとか工夫しなさい。
(もともとfread、writeがバッファリングしてるので、あまり効果は無いだろうけど)
あとboostのも1要素ごとの読み書きです。
入れ子になってるコンテナの巡回探査がデフォで出来るってだけ。
0703デフォルトの名無しさん
2008/06/20(金) 20:42:530704デフォルトの名無しさん
2008/06/20(金) 20:59:26まぁ今回の件に限らず、「コンマ1秒でも速くする」というような目標を持っている場合、
車輪の再発明は避けられないことが多いよね(そうでない場合も勿論あるけど)。
0705デフォルトの名無しさん
2008/06/20(金) 21:01:240706デフォルトの名無しさん
2008/06/20(金) 21:54:440707デフォルトの名無しさん
2008/06/20(金) 22:09:39(省略されました。続きを読むにはワッフルワッフルと書き込んでください)
0708デフォルトの名無しさん
2008/06/21(土) 01:24:43ポインタのある言語では、一気に話が複雑になるな。
0709デフォルトの名無しさん
2008/06/21(土) 06:23:29横着するつもりなら効率の劣化には目を瞑るべき。
大体そんな困るほど遅くなることなんぞ滅多に無いし。
0710デフォルトの名無しさん
2008/06/21(土) 12:47:42いうのに、最初からメモリ上に直列に並んでると考えるのはどうなのよw
0711デフォルトの名無しさん
2008/06/21(土) 12:51:19ポインタの無いJAVAみたいな言語だって、>686みたいな記述はできても、
要素の実際の読み書きは1つずつだろ?
0712デフォルトの名無しさん
2008/06/21(土) 14:46:07これは素晴らしい!!!
すこぶる高速ですね
0713デフォルトの名無しさん
2008/06/21(土) 14:49:44これstringの実装によってはやばくないのかな
0714デフォルトの名無しさん
2008/06/21(土) 15:00:33こんな気持ち悪いコード見たことない
0715デフォルトの名無しさん
2008/06/21(土) 15:01:03そのコードがダメなのははっきりしてるから。
続きも読め
0716デフォルトの名無しさん
2008/06/21(土) 15:01:060717デフォルトの名無しさん
2008/06/21(土) 15:42:550718デフォルトの名無しさん
2008/06/21(土) 16:59:18いや、プログラムの起動を可能な限り速くしたいというニーズはどこにでもある。
3秒で起動するブラウザと1秒で起動するブラウザ、どっちを使いたいかといえば速い方がいいに決まってる。
そういう場合のクラスデータのシリアライズは、1分かかるのを30秒にしたいとかいうオーダーの話ではなくて、
0.3秒かかるのを0.05秒に縮めたいとかいうオーダーなんだよ。
起動時にデシリアライズするオブジェクトの数は1つじゃないしな。
トータルで1秒以内で起動させたいとか、そういうレベルのことをやりたいとなると、
バイト配列の中に直列化したデータ(多少隙間があってもいい)をあらかじめ揃えておいて
一気にシリアライズするという考えも、アリだと思う。
0719デフォルトの名無しさん
2008/06/21(土) 17:02:02よっぽどアホな処理でもしてない限り大差ないだろ
0720デフォルトの名無しさん
2008/06/21(土) 17:09:11さっきドラゴンボール全巻買ってきた までは読んだ
:そこ、高速化したいなら横着せず書かないといけないって書いてんじゃん
0721デフォルトの名無しさん
2008/06/21(土) 17:38:070722デフォルトの名無しさん
2008/06/21(土) 17:46:02将来まで不変のデータ構造ならいいけど、
少しでも変えると過去のバージョンで直列化したデータが読めなくなるよね。
(すべてのバージョンに対するコンバータを付けるのもどうかと思うし)
痛し痒しだなぁ。
0723デフォルトの名無しさん
2008/06/21(土) 18:12:43既存の実装使おうと食い下がってるだけだじゃん。
0724デフォルトの名無しさん
2008/06/21(土) 18:28:070725デフォルトの名無しさん
2008/06/21(土) 18:35:28普通車なら速くはないが大体どこでも走れる
0726デフォルトの名無しさん
2008/06/21(土) 19:27:12べっ別にあんたのために実装したんじゃないんだからね。
すべてに効果のある実装は存在しない。自分の目的に合う実装がなければ自分で作る。
0727デフォルトの名無しさん
2008/06/21(土) 19:39:42入力データはwindows.hおよびそこからincludeされているファイルから抽出した
全て大文字の先頭以外にアンダーバー入りの定数マクロ(WM_hoge等)18364個。
文字列の平均の長さは20.8文字。
手抜きのために、カンマ区切りではなく改行区切りで保存。
テキスト(ifstream.getline()で読み込み)
vector<string> 23ms
deque<string> 21ms
list<sting> 21ms
バイナリ(ifstream.read()で読み込み)
vector<string> 14ms
deque<string> 12ms
list<sting> 12ms
ちなみに、VC++2008Stdでコンパイル、E8400のPCで実行。
全て複数回実行した中で一番速かった結果。
0728デフォルトの名無しさん
2008/06/21(土) 19:54:000729デフォルトの名無しさん
2008/06/21(土) 23:43:18テキスト(fgets()で読み込み+改行コード除去)
vector<string> 14ms
バイナリ(fread()で読み込み)
vector<string> 14ms
CreateFile,ReadFileも試してみた
テキスト(2048バイトずつ読み込み)
vector<string> 11ms
バイナリ(必要なサイズだけ読み込み)
vector<string> 100ms
0730デフォルトの名無しさん
2008/06/21(土) 23:47:59CString::GetBuffer()使ってみ
0731729
2008/06/21(土) 23:51:07テキスト形式でもバイナリ形式でも差がない感じ。
ちなみにテキスト形式でファイル一気読みでは、稀に10msが出る程度。
あと、バイナリ形式でReadFile()でチマチマ読むのは何故か遅かった。
fread()は速いのにね。
0732デフォルトの名無しさん
2008/06/21(土) 23:51:410733デフォルトの名無しさん
2008/06/21(土) 23:56:05それは「何故か」でも何でもなく明らかなことだ
fread()はチマチマじゃなくて「一気に」バッファに読み込んで
読み込んだ分だけユーザに渡してるから速いんだよ
0734デフォルトの名無しさん
2008/06/21(土) 23:57:47スレ違いかもしれないが重要なことだろ。
stringに高速にデータを読み込む方法は存在しない。
必ずコピーが発生するのだから。
カーネルバッファ→stdioバッファ→ユーザバッファ(典型的にはchar[])→string
こんな感じ
ほらみろ、効率悪い
0735デフォルトの名無しさん
2008/06/21(土) 23:59:58ってもうSTL作者になる以外ないな
0736デフォルトの名無しさん
2008/06/22(日) 00:00:38この場合だと、GetBuffer使うメリットねーと思う。
0737デフォルトの名無しさん
2008/06/22(日) 00:01:56いーやある。
fread()ではstringに直接読み込めないので一時的にchar[]に読み込んでコピー
するしかないが、
CString::GetBuffer()ならfreadで直接読み込める
つまり、一段コピーを減らせる
0739デフォルトの名無しさん
2008/06/22(日) 00:05:30は?何言ってんの。
CStringで適当なサイズをリザーブしといて、
GetBuffer()で取ったchar*のポインタにfread()しろっつってんだぞ?
間違いなくchar[]に読み込んでからstd::stringにコピーするより
速いよ。
0740739
2008/06/22(日) 00:09:03俺はstd::stringなんて使わなきゃ速いよつってるんだ。
最後にstd::stringにコピーしなきゃならないんなら意味ないわな、
そりゃ。
コピー君だもの。
0741デフォルトの名無しさん
2008/06/22(日) 00:11:10が速いんじゃないの?書式化なしだし
0742デフォルトの名無しさん
2008/06/22(日) 00:12:10いってることはりかいできるけど、俺が言いたかったのはそうじゃない。
俺が言ってるのは、読み込んだデータには
複数のデータ(複数の文字列と文字列サイズのペア)が格納されてるってことだ。
んで、>>686あたりからの流れのように、vectorに一個一個格納すると。
まあすれ違いだからもう自重する。
0743デフォルトの名無しさん
2008/06/22(日) 00:12:33それはどんだけ頑張ってもマクロ版のgetc()/putc()と同等の速度で、
言うまでも無くfread()より遅いよ
0744デフォルトの名無しさん
2008/06/22(日) 00:12:560745デフォルトの名無しさん
2008/06/22(日) 00:27:04そりゃそうだ
比べるのが無謀
というか比べるな
0746デフォルトの名無しさん
2008/06/22(日) 01:02:51char*, const char*のかわりに使えるし
STLやboostのiterator取るタイプの関数も全部使えるし
std::stringと違ってバッファ直接書き換えできるよ
0747デフォルトの名無しさん
2008/06/22(日) 01:04:21遅い。
0748デフォルトの名無しさん
2008/06/22(日) 01:10:19上に出てるように、ちまちまReadFile()を呼ぶようなアホなまねをやるぐらいなら
まだfread()のほうが速いよ
0749デフォルトの名無しさん
2008/06/22(日) 01:11:460750デフォルトの名無しさん
2008/06/22(日) 01:17:54関数だのAPIだのを使う際には全てこの議論は当てはまるんだぜ
別にI/Oだけの問題じゃない
std::stringを使っている限りは常にコピーがワンクッション入ることを
覚悟せよってこった
通常はどうでもいい問題だがな
0751デフォルトの名無しさん
2008/06/22(日) 01:57:38ドライバ書けと
0752デフォルトの名無しさん
2008/06/22(日) 01:59:570753デフォルトの名無しさん
2008/06/22(日) 02:07:28実現するのに少し不利なんだよな
0754デフォルトの名無しさん
2008/06/22(日) 02:07:520755デフォルトの名無しさん
2008/06/22(日) 02:08:100756デフォルトの名無しさん
2008/06/22(日) 02:21:07ブラウザはどういう仕組みになっているのか知らないが
Unicodeをリトルエンディアンのまま画面出力できるようになっているのか、
それともビッグエンディアンに並び替えて表示しているのか
0757デフォルトの名無しさん
2008/06/22(日) 02:56:120758デフォルトの名無しさん
2008/06/22(日) 02:58:27最適化されててもたいしたメリットは無い。
0759デフォルトの名無しさん
2008/06/22(日) 08:20:06要するにオンメモリでの利用形式を、保存形式に合わせるw
0760デフォルトの名無しさん
2008/06/22(日) 09:06:23ファイルマッピングはファイルサイズを伸ばせないのが難点だな。何かいい方法がないものか。
0761デフォルトの名無しさん
2008/06/22(日) 09:50:40ReadFile()やWriteFile()は別にディスクをガリガリ読み書きする
わけじゃなくて、オンメモリのバッファキャッシュが相手だからな
事実上裏でOSがページ単位でファイルマッピングしてるのと同じで
CreateFileMapping()したからつって経験上別に速くならないよ
Windowsではな
話を大幅に戻すと、小手先の最適化に走る前に、本当にCSVやvector<string>
じゃなければいけないのかってところを考えるべきだと思うね
固定長データ、ISAM、SQLite、Berkeley DBのようなものが適切なんじゃないかとかさ
0762デフォルトの名無しさん
2008/06/22(日) 16:22:09(普通に使う分には)充分な速度が出る。
ただし、複数回のコピーが無駄と言えば無駄。
ReadFileは、OSのバッファにキャッシュしていてディスクアクセスはしないものの、
システムコールだから、カーネルとのスイッチが発生する。
だから、細かく何度も呼び出すと非常に遅くなる。
CreateFileMappingと使うと、OSのバッファキャッシュを経由しないので
ゼロコピーとなり、読み出しに限れば最速を期待できる。
書き込みは、普通はバッファリングされるfwriteを使うべき。
Readと同様、直接APIを叩いても大して効果ないし
逆にバッファリングを無効にすると、ディスクアクセス完了まで待たされることになる。
この場合にどうしても最速を求めるなら、非同期APIを使う。
0763デフォルトの名無しさん
2008/06/22(日) 16:52:11読み込みと、書き込み(表示)について練り込まれた結果の
知識が詰まってるなと思った。 ちなみに read() write() 使ってた。
0764デフォルトの名無しさん
2008/06/22(日) 17:36:20stdioはバッファリングしてるけど
fgetc/fputcのような、1文字入出力系は注意。
最近のVCとかは、マルチスレッド対応ライブラリで
1文字ごとにロックしているので、このコストがバカにならない。
遅いと言われるcygwinとかもそうかもしれない。
istream_iteratorとかは知らんが、MT対応を謳っているなら
ロックしている可能性は十分ある。
0765デフォルトの名無しさん
2008/06/22(日) 19:54:160766デフォルトの名無しさん
2008/06/22(日) 19:56:020767デフォルトの名無しさん
2008/06/22(日) 20:17:58実装の質の問題というよりは、仕様上無理なんじゃないか。
ios_base::sync_with_stdio()とかあるし、デフォでシンクロしてるのが仕様だから、
stdioをバイパスできず、stdioの上に構築せざるをえないってことになる。
おまけに仕様も複雑だ。
これでstdioより速くなるわけがないんだぜ。
0768デフォルトの名無しさん
2008/06/22(日) 20:23:360769デフォルトの名無しさん
2008/06/22(日) 22:22:470770デフォルトの名無しさん
2008/06/22(日) 22:53:16そもそも
(世にある)シリアライズ機構 = 高速化のためのもの
という発想が間違い。
シリアライズ機構 =
ヘテロなオブジェクトの集合であっても、汎用的に直列表現に置き換えるための汎用枠組み
ととらえる方が常識で、(たとえば>>699みたいに)
でも汎用では自アプリにとっては遅くて不都合!という場合に、
自アプリに特化した、汎用無視の保存方法作る、というのがさらに常識。
CSVって決まってるならCSV特化とかね。そのかわりそこ変わった瞬間に大幅変更だけど。
0771デフォルトの名無しさん
2008/06/22(日) 23:19:12バカなの?
ぶっちゃけRubyのほうが100万倍マシ
0772デフォルトの名無しさん
2008/06/22(日) 23:23:20はいはい、そうですね
0773デフォルトの名無しさん
2008/06/22(日) 23:27:470774デフォルトの名無しさん
2008/06/23(月) 02:08:48あーきっとアホの子なんだろうなーと思って残りを見たら
完全にその通りだった。
0775デフォルトの名無しさん
2008/06/23(月) 03:37:070776デフォルトの名無しさん
2008/06/23(月) 07:43:160777デフォルトの名無しさん
2008/06/23(月) 08:06:04それを先にこうして予測したことで、ちょっとルートが変わるかもしれないな。
0778デフォルトの名無しさん
2008/06/23(月) 10:59:250779デフォルトの名無しさん
2008/06/23(月) 11:23:270780デフォルトの名無しさん
2008/06/23(月) 11:55:360781デフォルトの名無しさん
2008/06/23(月) 13:00:250782デフォルトの名無しさん
2008/06/23(月) 14:35:23例えば宗教団体の信者は熱心に勧誘を行って、結果周りから見るとイメージダウンをしている。
似たようなもんでは
0783デフォルトの名無しさん
2008/06/23(月) 17:29:520784デフォルトの名無しさん
2008/06/24(火) 20:00:11では、queueの要素を指すポインタは無効になることがありますか?
下のプログラムを実行すると、1 2 4 4 5 6 と出力され、期待通りに動きました。
このプログラムは正しいプログラムですか?
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3); int* x = &q.back();
q.push(4);
q.push(5);
q.push(6);
(*x)++;
while (!q.empty()) {
cout << q.front() << ' ';
q.pop();
}
return 0;
}
0785デフォルトの名無しさん
2008/06/24(火) 20:11:36queueの中身のデフォはdequeなので、要素追加で
リアロケートが発生することがある。ポインタもイテレータも無効になる。
0786784
2008/06/24(火) 21:00:22なるほど。ありがとうございます。危ないところでした。
では、リストを使って、queue<int, list<int> > q;
とすればOKでしょうか?
0787デフォルトの名無しさん
2008/06/24(火) 21:30:01途中への追加はイテレータ等が無効になる可能性があるけど
端への追加ではイテレータ等は無効になんないんじゃないの?
0788デフォルトの名無しさん
2008/06/24(火) 21:46:06> 23.2.1.3 deque modifiers
> An insert at either end of the deque invalidates all the iterators to the deque,
> but has no effect on the validity of references to elements of the deque.
イテレータは無効になるが、要素への参照は有効のまま。
0789デフォルトの名無しさん
2008/06/25(水) 09:16:26vectorやdequeなら、イテレータではなく添え字でアクセスするのも有り。
0790デフォルトの名無しさん
2008/06/28(土) 14:03:55ifstream ifs(argv[1]);
vector<char> file;
copy(
istream_iterator<char>(ifs.seekg(10, ios_base::beg))
istream_iterator<char>(ifs.seekg(20, ios_base::beg))
back_inserter(file)
);
上記のようなコードで、あるファイルの10バイト目から20バイト目までをコピーしようとおもったのですが、出来ませんでした。
このような事をする場合はどうしたらいいのでしょうか?
0791デフォルトの名無しさん
2008/06/28(土) 15:14:14int const begin = 10;
int const end = 20;
ifs.seekg(begin);
int const length = end - begin;
file.resize(length);
ifs.read(&file[0], length);
0792デフォルトの名無しさん
2008/06/28(土) 15:21:29ありがとう、だけどファイル以外のストリームに対しても同じ方法がとりたいとおもっているので、
algorithmのcopy、あるいはSTLの何かを使って解決したいのです。
で、思いついたのが790のコードなのです。
0793デフォルトの名無しさん
2008/06/28(土) 17:36:54>791 はファイル以外のストリームにも使えるんじゃないか?
seekg() ができないかもしれないってこと?
0794デフォルトの名無しさん
2008/06/28(土) 17:41:540795デフォルトの名無しさん
2008/06/28(土) 20:43:54istreambuf_iterator<char>使え
istream_iterator<char>はoperator>>で入力するから、空白とか
スキップする。コピーにならんぞ
0796デフォルトの名無しさん
2008/06/28(土) 20:57:410797デフォルトの名無しさん
2008/06/28(土) 21:09:48それ「どうでもいい」事じゃないと思うw
0798デフォルトの名無しさん
2008/06/29(日) 22:25:500799デフォルトの名無しさん
2008/06/30(月) 00:24:580800デフォルトの名無しさん
2008/06/30(月) 00:30:100801デフォルトの名無しさん
2008/06/30(月) 01:44:470802デフォルトの名無しさん
2008/06/30(月) 08:15:27哺乳類としてのプライドはどこへ
0803デフォルトの名無しさん
2008/06/30(月) 08:54:170804デフォルトの名無しさん
2008/06/30(月) 09:01:33やつら爬虫類が生まれた頃にはまだ哺乳類も鳥類も居なかったってのに。
赤外線センサーまでつけやがって。
0805デフォルトの名無しさん
2008/06/30(月) 16:22:470806デフォルトの名無しさん
2008/06/30(月) 18:24:07鯨だけは愛と権利が与えられるべきだと思います
STL
0807デフォルトの名無しさん
2008/06/30(月) 18:27:030808デフォルトの名無しさん
2008/06/30(月) 19:09:100809デフォルトの名無しさん
2008/07/01(火) 21:42:200810デフォルトの名無しさん
2008/07/01(火) 21:49:130811デフォルトの名無しさん
2008/07/01(火) 23:20:250812デフォルトの名無しさん
2008/07/02(水) 02:02:120813デフォルトの名無しさん
2008/07/02(水) 02:11:21そこにシニカルなアーティクルか精神的原論を見出せるかどうかを試してから通報すべきだ
日本は民主主義社会だっていってたよ確か誰かが
毎日と朝日の新聞見ながら泡噴きながら
人食いてぇ=女の子監禁してぇ
人(で)食いてぇ=女の子換金してぇ
人=幼女
人=稚児
人=人
通報しますた
0814デフォルトの名無しさん
2008/07/02(水) 07:41:04鳥類とか哺乳類とか人間とかあんまり関係ないだろ。
0815デフォルトの名無しさん
2008/07/02(水) 09:19:26通報されないように気を付けて。
ところで、map<int,bar*> mに挿入する時、
m.insert(map<int,foo*>::value_type(0, new foo))とか
m[0]=new fooとか
するのはヤバいよね。
スマポ使えない状況でどう書くのが一番スマートですか?
0816デフォルトの名無しさん
2008/07/02(水) 10:17:56try
{
m.insert(map<int,foo*>::value_type(0, p));
// m[0] = p;
}
catch(...)
{
delete p;
throw;
}
0817デフォルトの名無しさん
2008/07/02(水) 10:19:22・map<int, test<bar> >
後はしらね。勝手に適当にメソッドでnewが隠蔽されるようなものでも書けば良いと思うよ。
0818デフォルトの名無しさん
2008/07/02(水) 11:20:34たった今>>811に食われたじゃないか
0819デフォルトの名無しさん
2008/07/02(水) 11:56:46if (!map.insert(std::make_pair(0, p)).second) {
delete p;
p = 0;
}
0820デフォルトの名無しさん
2008/07/02(水) 12:03:460821デフォルトの名無しさん
2008/07/02(水) 12:18:09insertで例外起きたらメモリリークするでよ
0822デフォルトの名無しさん
2008/07/02(水) 13:35:58それだと m[0] に既存のポインタが入っていた場合にリークする。
↓これでいいかな?
foo* p = new foo;
try
{
&nbps; foo*& in = m[n];
&nbps; delete in;
&nbps; in = p;
}
catch (...)
{
&nbps; delete p;
&nbps; throw;
}
「スマポ使えない」と言ってもさすがに auto_ptr は使えるだろうから、
↓こっちのがいいと思う。
std::auto_ptr<foo> p(new foo);
foo*& in = m[n];
delete in;
in = p.release();
0823822
2008/07/02(水) 13:37:02foo* p = new foo;
try
{
foo*& in = m[n];
delete in;
in = p;
}
catch (...)
{
delete p;
throw;
}
0824デフォルトの名無しさん
2008/07/02(水) 20:34:55try {
std::swap(p, m[0]);
delete p;
}
catch(...) {
delete p;
throw;
}
0825デフォルトの名無しさん
2008/07/03(木) 01:52:19簡単に
pair<map<int,bar*>::iterator, bool> ib(map.insert(std::make_pair(0, 0)));
if (ib.second)
ib.first.second = new foo;
でも良い気がするけど。
0826デフォルトの名無しさん
2008/07/05(土) 23:35:18tr1::unordered_set< vector<unsigned char> >とすると
‘struct std::tr1::hash<std::vector<unsigned char, std::allocator<unsigned char> > >’
と怒られてしまいます。これは何が悪いのでしょうか?
(vector用のhash関数を自分で作る必要があるということでしょうか?)
0827デフォルトの名無しさん
2008/07/05(土) 23:41:480828デフォルトの名無しさん
2008/07/06(日) 03:22:08コードとエラーメッセージをちゃんと貼れ。
0829デフォルトの名無しさん
2008/07/08(火) 04:21:23もう嫌だ。
0830デフォルトの名無しさん
2008/07/09(水) 17:51:42#include <vector>
using namespace std;
class A {
int val;
public:
A(){cout<<"new"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ val = x; }
int getval(void){ return val; }
};
int main () {
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ) {
a.setval( i );
list.push_back( a );
}
cout <<"------------------------------------ Line2"<< endl;
//cout << "size:\t\t" << list.size() << endl;
//cout << "list[data,3]:\t" << list[data, 3] << endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
0831デフォルトの名無しさん
2008/07/09(水) 17:54:23push_backのリサイズ時では何が起こっているのでしょうか
0832デフォルトの名無しさん
2008/07/09(水) 18:14:060833デフォルトの名無しさん
2008/07/09(水) 18:46:380834デフォルトの名無しさん
2008/07/09(水) 19:57:590835デフォルトの名無しさん
2008/07/09(水) 20:48:24push_back後に1loopの目安として新しく
cout<<"----------------------------------"<<endl;
を付け足して走らせてみたところ
Line1とLine2の間の"copy"と"delete"の表示が
copy がpushした回数+1
deleteがpushした回数
になりました。
copyの回数が+1なのが気になります。
入れる側の参照+listに入っている数と考えそうになりましたが
これでサイズを比べて足りないようなら再確保…と考えるのは変よですね
copyとdeleteの順番と回数を考えると
前のvectorから入っている分コピーした回数+付け足す側からコピーの一回分
という事でしょうか
0836デフォルトの名無しさん
2008/07/09(水) 20:58:59既にpushされているのが2個なので
copy ←コピーしようとした
ここでサイズが足りないので再確保
copy ←コピーしようとした
copy ←前のvectorからコピー
copy ←前のvectorからコピー
delete ←入れようとした時のテンポラリの破棄?
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
でしょうか、なんだか混乱してきました…。
0837デフォルトの名無しさん
2008/07/09(水) 21:23:27copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←新しい要素のコピー
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。
valの値も表示させれば分かるべ。
0838デフォルトの名無しさん
2008/07/09(水) 21:43:283回目のpush_backでcopyが4つ表示されているので混乱しています。
0839デフォルトの名無しさん
2008/07/09(水) 21:49:500840デフォルトの名無しさん
2008/07/09(水) 21:54:59copy
copy
delete
-----------0
copy
copy
copy
delete
delete
delete
-----------1
copy
copy
copy
copy
delete
delete
delete
-----------2
略
こう表示されています
環境は VC++2005EE +SDK win2000 です
0841デフォルトの名無しさん
2008/07/09(水) 21:56:29int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
略
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i )
{
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
略
ソースはこうなってます
0842デフォルトの名無しさん
2008/07/09(水) 22:03:30----------------------------------0
copy
copy
delete
----------------------------------1
copy
copy
copy
delete
delete
----------------------------------2
うちではこうなった。
VC++2008EE
forループ入る前にvectorになんか入れてない?
size()の値表示させてみ。
0843デフォルトの名無しさん
2008/07/09(水) 22:06:00#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
int main (){
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ){
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
0844デフォルトの名無しさん
2008/07/09(水) 22:36:38ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。
その変数のコピーと破棄が1回ずつ多いみたい。
2005のソースはわからんが多分同じ理由だろう。
0845デフォルトの名無しさん
2008/07/09(水) 22:41:38付き合ってくれた皆さん、本当にありがとうございました。
0846デフォルトの名無しさん
2008/07/09(水) 23:04:39>追加する要素を一旦ローカル変数にコピーしてた。
list.push_back( list[3] );
0847デフォルトの名無しさん
2008/07/18(金) 00:05:45string text="000...01"; // text.size()==100000
string pattern="000...01"; // pattern.size()==10000
text.find(pattern);
としたとき、自前で実装したKMPと比較して明らかに遅いのですが・・・
0848デフォルトの名無しさん
2008/07/18(金) 00:15:190849デフォルトの名無しさん
2008/07/18(金) 00:40:20環境による
ヘッダ嫁
0850デフォルトの名無しさん
2008/07/18(金) 10:40:02前処理が必要となるBM法とかを
1回しか探索しないfindやstrstrが使ってるわけ無いじゃん。
当たり前すぎる。
おまえのKMP法は、前処理の時間も含めてもfindより速いのか、
つまり、毎回探索文字列が変わる処理に適応できるのか
その辺から考察してみろよ。
0851デフォルトの名無しさん
2008/07/18(金) 10:45:590852デフォルトの名無しさん
2008/07/18(金) 10:49:33探索文字列の長さを調べてから探索アルゴリズムを選択するように実装すべき、ということで。
0853デフォルトの名無しさん
2008/07/18(金) 11:23:12strstrが特殊アルゴリズムを用いない理由として
テキストの長さが不明な場合には
BM法とかの非全文字探索アルゴリズムが使えない、というのがあるけど
findに関しては、(ランダムアクセス可能なものは)テキストの長さが事前にわかるから
アルゴリズム選択は完全にバカげてる、と言いきれるほどではなさそうだね。
実際、set::find等は、そのコンテナ向きのアルゴリズムで実装されてるし。
とはいえ、それをふまえても
find(やstrstr)は1回きりの短文探索向きのままで
それ以外でかつ速度が必要なら自分で実装して使い分ける、という
今の形の方がずっと良いとは思うけど。
0854デフォルトの名無しさん
2008/07/19(土) 01:58:05前処理は大した速度低下には繋がらないと思いますが、
確かに無駄ではありますね。標準ライブラリは特殊な例に対しても
致命的に遅くならないように実装されているものだと認識していたので、意外でした。
ただ、memcpy()とmemmove()みたいなのがあるのなら、
find_kmp()とかfind_bm()とか用意してくれていても良いような気が…
>> 850
> 「同じ文字列を何度も探索する」という前提で〜
そんな前提がありましたっけ?自分の理解不足でしたらすみません
0855デフォルトの名無しさん
2008/07/23(水) 09:40:38STLPortの分かりやすいリファレンスマニュアルってあるんですか?
探したんですが見つからなくて・・・
英語でもかまいませんので知っていたらお願いしますm(_ _)m
0856デフォルトの名無しさん
2008/07/23(水) 09:46:17実装している人が違っていて、速度やバグが違うだけです。
0857デフォルトの名無しさん
2008/07/23(水) 09:56:21まったく同じならVisualStudioのマニュアルを参考にします。
ありがとうございますm(_ _)m
0858デフォルトの名無しさん
2008/07/23(水) 10:28:560859デフォルトの名無しさん
2008/07/23(水) 21:28:310860デフォルトの名無しさん
2008/07/31(木) 01:43:52ttp://data.tumblr.com/9DQFI7v3h51iqibpyc3ihDNZ_500.jpg
0861デフォルトの名無しさん
2008/07/31(木) 02:14:55それよりコンテナの違いを、馬鹿後輩にもわかるように一つ頼むよ。
vectorをlistにキャストしちゃだめだぁぁぁぁぁぁぁぁ!
気の利いた説明はできないけど、ぜんぜん駄目なんだぁぁぁぁぁぁぁ!
ごめん、おれ、うまく説明できないんだ。 あした、おれが直すんだ。。
0862デフォルトの名無しさん
2008/07/31(木) 10:08:150863デフォルトの名無しさん
2008/07/31(木) 11:31:310864デフォルトの名無しさん
2008/07/31(木) 18:00:44もしくは、
>>861「vectorをlistとか、ありえないです!クズです!しねです!
Enterキーとリセットボタンこっそり入れ替えられろです!
むしろ人生リセットしろです!!」
って、ひかれるくらい可愛くな。
0865デフォルトの名無しさん
2008/07/31(木) 22:15:29コンテナ以前に、キャストの仕組み ( static, reinterpret, ...etc ) を説明した方が良いのでは。
そのまま放置すると、何でも void* でやりとりすれば OK とか、コンパイルが通るだけの危険
コードを量産しそうな気がする。
あとコンテナの違いは、ここが分かり易いと思う。
http://ufcpp.net/study/stl/index.html
0866デフォルトの名無しさん
2008/08/01(金) 00:08:12class CDerived が class CBase の派生とき
vector<CBase*>* を vector<CDerived*>* にキャスト。
0867デフォルトの名無しさん
2008/08/01(金) 00:43:49ヒトデをあげるからおちつけ
0868861
2008/08/01(金) 01:22:54俺が悪かった。
>>865
俺も勉強不足だった。 俺が勉強してから、後輩にurl教える。
ちなみに、キャストはCキャストだったので、多分、、なにそれおいしいの状態だと思う。
ともあれthx.
0869デフォルトの名無しさん
2008/08/01(金) 03:19:470870デフォルトの名無しさん
2008/08/01(金) 03:35:01こういうの見るとキャストしたくなる みたいな?
0871デフォルトの名無しさん
2008/08/01(金) 03:43:400872デフォルトの名無しさん
2008/08/01(金) 03:46:080873デフォルトの名無しさん
2008/08/02(土) 09:22:33いいなそれww
0874デフォルトの名無しさん
2008/08/05(火) 02:27:400875デフォルトの名無しさん
2008/08/05(火) 03:55:40それはソートするしかないだろう。
順番が重要でなければ、nth_element使ってi番目を求めて、
i以降に対してもう一度nth_elementという方法もあるが
partial_sortと大して変わらないと思う。
0876デフォルトの名無しさん
2008/08/05(火) 05:58:47一度全体順位(sort)出さないと不可能
0877デフォルトの名無しさん
2008/08/05(火) 15:39:030878デフォルトの名無しさん
2008/08/05(火) 22:00:22setだろ。
0879デフォルトの名無しさん
2008/08/06(水) 00:14:45ソートされていないvector<int>という条件は鵜呑みにするとして、
他に何か特別な性質はあるか?
そこから突いていけば手はあるかも知れない
そこに何の前提も置けないならry
0880デフォルトの名無しさん
2008/08/06(水) 02:42:570881875
2008/08/06(水) 03:01:58ずっと前に作った中央値を求めるベンチマークを再度実行してみたら、
要素数10万でsortやpartial_sortの5倍くらい速いわ。
nth_elementがこれだけ速いなら、iとjの範囲によっては、nth_elementを
2回やってから、その部分だけsortの方が速いかもしれないね。
中央値を求める目的では、partial_sortはsortと大差なかった。
良くて10%速い程度かな。もっと小さい範囲で使うものだね。
ちなみにmultisetに突っ込むのは、恐ろしく遅かった。
0882デフォルトの名無しさん
2008/08/07(木) 00:06:330883デフォルトの名無しさん
2008/08/07(木) 00:50:36中央値って知ってる?
0884デフォルトの名無しさん
2008/08/07(木) 21:13:000885デフォルトの名無しさん
2008/08/08(金) 06:59:070886デフォルトの名無しさん
2008/08/09(土) 16:32:240887デフォルトの名無しさん
2008/08/12(火) 05:25:300888デフォルトの名無しさん
2008/08/12(火) 10:53:20stlportとか入れるとこういうのも置き換わって高速化されたりするんですか?
0889デフォルトの名無しさん
2008/08/12(火) 13:15:110890デフォルトの名無しさん
2008/08/12(火) 13:24:410891デフォルトの名無しさん
2008/08/12(火) 17:39:15class CHoge
{
public:
CHoge() { a = new int; }
int* a;
};
のように、メンバを全てコンストラクタで動的に作成するクラスがあります。
std::vector<CHoge> hoge;
hoge.resize(10);
*hoge[0].a = 10;
*hoge[1].a = 20;
とすると、*hoge[0].a、*hoge[1].a ともに20となってしまいました。
意図としては new は 10回通る予定だったのですが、
実際に new を通ったのは1回だけで、残りはコピーコンストラクタで初期化されてしまったようで、
a 自体がコピーされ、10個の *a が全て同じ場所をさしてしたようです。
pimpl などで割りとよく使われる実装だと思うのですが、
この resize の挙動は規格で決まっているのでしょうか?
これを解決するには、コピーコンストラクタを実装するか、
コンストラクタではなく初期化関数を作って自分で呼び出す、しかないでしょうか?
よろしくお願いします。
0892デフォルトの名無しさん
2008/08/12(火) 17:57:28void resize(size_type sz, T c = T());
新しい版では
void resize(size_type sz);
void resize(size_type sz, T c);
になってる気がする・・・
知らん間に変わったのかも
いずれにせよ、コピーコンストラクタを実装しとくのが身のため
その例にはないけど、デストラクタで解放するんだろ?
vectorのcapacityが溢れたときに死にそう
0893デフォルトの名無しさん
2008/08/12(火) 18:56:370894デフォルトの名無しさん
2008/08/13(水) 11:43:40http://www5c.biglobe.ne.jp/~ecb/cpp/07_11_03.html
このページ見てやってみたのですが、うまく行きませんでした。
アドバイス頂けると幸いです。
0895デフォルトの名無しさん
2008/08/13(水) 11:50:38先ずは、どう「うまく行かなかったか」を説明するといいよ。
0896デフォルトの名無しさん
2008/08/13(水) 11:52:33自分は通常、一番後ろから移動してきてpop_backしちゃうんですけど
それだとインデックスが変わってしまうので面倒な場面があります
そこで、空きインデックス用のvectorを別に作り、要素削除時にその
インデックスを登録していき、push_auto等の関数を作って空き領域に
入れていく方法を考えたりと、試行錯誤しています
なんかこの辺をうまいこと解決したコンテナってSTLにないですかね^^;
0897デフォルトの名無しさん
2008/08/13(水) 11:52:42binary_functionはいくつかのtypedefをするのに必要。
0898895
2008/08/13(水) 11:54:22struct func : binary_function<T, T, bool> {
bool operator()(const T& X, const T& Y) const{
return (X < Y); // ←ここを書き換える
}
};
これで、
expected `{' before '<' token
expected template-name before '<' token
expected unqualified-id before '<' token
のようなエラーが出てしまいました。
0899895
2008/08/13(水) 11:57:56ありがとうございます!
#include <functional> してませんでした。
しかし、これを書き足した上でコンパイルしても同じエラーが出ました。
0900デフォルトの名無しさん
2008/08/13(水) 11:59:000901デフォルトの名無しさん
2008/08/13(水) 12:00:39エラーがどの行で出たのか位書けませんか?
それとも、その辺りを察しろと言うことですか?
それから、名乗るのなら「894」でしょ。
>>900
>894に書かれているサイトのソースの該当行を書き換えた結果が>898。
0902894
2008/08/13(水) 12:03:09// ここを書き換える の部分のことですよね??
とりあえずコンパイルしてみただけなので、まだ書き換えてないです。
>>901
すいません。
>>898 の2行目で出ています。
0903デフォルトの名無しさん
2008/08/13(水) 12:04:01VC9.0
0904894
2008/08/13(水) 12:05:52自分のところはMinGW5.1.3です。
0905デフォルトの名無しさん
2008/08/13(水) 12:06:43まあqueueの中でincludeしてるかもしれんが
0906894
2008/08/13(水) 12:11:490907デフォルトの名無しさん
2008/08/13(水) 12:12:25#include <iostream>
#include <cstdlib>
#include <vector>
#include <functional>
#include <queue>
template <class T>
struct func : std::binary_function<T, T, bool> {
bool operator()(const T& X, const T& Y) const{
return (X > Y);
}
};
int main()
{
std::priority_queue<int, std::vector<int>, func<int> > pq;
int i;
for (i = 0; i < 10; i++ )
pq.push(std::rand()%10);
while (!pq.empty()) {
std::cout << pq.top() << ' ';
pq.pop();
}
std::cout << std::endl;
}
0908デフォルトの名無しさん
2008/08/13(水) 12:22:050909894
2008/08/13(水) 12:24:03template<class T>
struct func : binary_function<T, T, bool> {
bool operator()(const T& X, const T& Y) const{
return (X < Y); // ←ここを書き換える
}
};
のあとでnaming use space std; してました。
binary_functionがstd だったんですね。。ありがとうございましたm(_ _)m
0910デフォルトの名無しさん
2008/08/13(水) 12:33:480911デフォルトの名無しさん
2008/08/13(水) 12:35:300912デフォルトの名無しさん
2008/08/13(水) 12:41:11C++ の基礎とか関係ない。煽りたいのならもうちょっとましな煽り方をしろよ
0913デフォルトの名無しさん
2008/08/13(水) 12:42:440914デフォルトの名無しさん
2008/08/13(水) 12:48:170915デフォルトの名無しさん
2008/08/13(水) 13:01:540916894
2008/08/13(水) 14:03:130917デフォルトの名無しさん
2008/08/13(水) 14:03:420918デフォルトの名無しさん
2008/08/13(水) 18:35:48えぬすえれめんと?
0919デフォルトの名無しさん
2008/08/13(水) 19:00:500920デフォルトの名無しさん
2008/08/13(水) 19:13:060921デフォルトの名無しさん
2008/08/13(水) 23:23:07マニュアルなどを見ても何も記載がないので、
VC++やg++で試してみると何も起きないので平気かなと思ったのですが。
#include <set>
int main()
{
std::set<int> s;
s.insert(1);
s.erase(2);
}
0922デフォルトの名無しさん
2008/08/13(水) 23:26:56そりゃそうだろ
ところで削除した数を返すので試してみな
ゼロを返すはずなので
0923デフォルトの名無しさん
2008/08/14(木) 10:45:43AcademicEdition のC++でDebug実行すると、STLのlistライブラリの中、
213行目で「iterator not dereferencable」という実行時エラーが出て
しまいます。このエラーの意味ってなんですか? VC++2003まではこんな
エラーが出ていなかった気がするんですが。プログラムも変更した覚えは
ないですけど
0924デフォルトの名無しさん
2008/08/14(木) 10:55:11我々はエスパーではない。 コードも貼らずにエラーの原因が解かるとでも思ってるのか。
0925デフォルトの名無しさん
2008/08/14(木) 11:04:300926デフォルトの名無しさん
2008/08/14(木) 11:11:17end越えてデータ取得しようとしてるんじゃね?
0927デフォルトの名無しさん
2008/08/14(木) 11:17:17っ ⌒ ttp://search.live.com/results.aspx?q=iterator+not+dereferencable&FORM=ADDLVD&src=
0928デフォルトの名無しさん
2008/08/14(木) 11:20:13あるがとうございます。私もそれを疑って調べています。
外国の掲示板に「iterator not dereferencable」の実行時
エラーが出てきたという質問があって、やはりそのような
関係のエラーが考えられる、前のプログラムが正しくない
からだという回答がありました。
質問者は以前のコンパイラ(VC++7.0)ではそんなエラーはでな
かったと言ってましたが。
私自身もVS2003では実行時エラーが出なかったプログラムが
VS2005で出だしてよく調べたら、プログラムにバグがあって
VS2003では見逃されていたという苦い経験があります。
いまテンプレート使いまくりの呪文みたいなコードをチェック
してますが、まだバグをみつけきっていませんorz
0929デフォルトの名無しさん
2008/08/14(木) 11:23:13前のプログラム→お前のプログラム
0930デフォルトの名無しさん
2008/08/14(木) 11:55:47i--; // 無効なデクリメント
みたいなコードが入ってるのでは?
VS2003は iterator は T* のtypedefだから範囲検査がなかったけど、
VS2005のdebug 版はちゃんと警告を出してくれるとか
0931デフォルトの名無しさん
2008/08/14(木) 12:03:11STLPortとか使ってるとまた違うのかな・・・
0932デフォルトの名無しさん
2008/08/14(木) 12:27:23VCはVC8(2005)からそのへん強化されたんだっけ。
0933デフォルトの名無しさん
2008/08/14(木) 12:43:19>vector<T>::iterator i=container.begin();
>i--; // 無効なデクリメント
もろにこれと似たコード使ってます(;^ ^)。++iですけど
やはり、end()をオーバーしているか、インサート
した後に古いイテレータで参照しているんでしょう。
VS2005のヘルプには、確かに標準C++ライブラリの新機能として
『不正な反復子の使用を検出する機能がサポートされました。
詳細については、「反復子のデバッグのサポート」と「Checked
Iterators」を参照してください』
とあります。
ともかく、エラーの見当がついてきました。
ありがとうございました。
0934デフォルトの名無しさん
2008/08/14(木) 13:05:38>やはり、end()をオーバーしているか、
念のため、end()は、有効な範囲の一つ後ろにあるから、end()を"オーバー"しなくても、
end()に到達した状態で参照するとエラーになるよ。
0935デフォルトの名無しさん
2008/08/14(木) 17:03:27自分では一度も経験した事のないエラー例が山ほど
書き込まれて、しかもそれの原因を探るのはなんか
オラはワクワクするぞ。
0936デフォルトの名無しさん
2008/08/14(木) 17:08:03欲しい所なんだが今はどうなってるんだろう
0937デフォルトの名無しさん
2008/08/14(木) 17:49:380938デフォルトの名無しさん
2008/08/14(木) 17:53:530939デフォルトの名無しさん
2008/08/17(日) 22:40:37もっとも短い宣言方法を教えてください。
0940デフォルトの名無しさん
2008/08/18(月) 00:03:330941デフォルトの名無しさん
2008/08/18(月) 00:29:24最小値を先に取り出したい時も、単にgreater<T>を使えばいいのね。どーも>>940
0942デフォルトの名無しさん
2008/08/18(月) 19:13:35リスト(主にdoubleを想定)を受け取る関数やコンストラクタは
どんな受け取り方すれば使いやすいか迷ってる。
いつもどう書いてる?
beginとend?
0943デフォルトの名無しさん
2008/08/18(月) 20:06:250944デフォルトの名無しさん
2008/08/19(火) 05:27:05template<class T>
void func(std::list<T> &lst)
リスト以外のコンテナも渡したくなったら
template < template<class T, class Allocator=std::allocator<T>> class ConT >
void func(ConT<T> &con)
こうやってる
0945デフォルトの名無しさん
2008/08/19(火) 21:30:170946デフォルトの名無しさん
2008/08/20(水) 01:51:510947デフォルトの名無しさん
2008/08/20(水) 02:37:530948デフォルトの名無しさん
2008/08/20(水) 02:55:230949デフォルトの名無しさん
2008/08/20(水) 03:04:450950デフォルトの名無しさん
2008/08/20(水) 07:24:380951デフォルトの名無しさん
2008/08/20(水) 07:39:530952デフォルトの名無しさん
2008/08/20(水) 08:00:030953デフォルトの名無しさん
2008/08/20(水) 08:24:25iteratorだけではどう書けばいいでしょうか?
0954デフォルトの名無しさん
2008/08/20(水) 08:36:39現状では list 本体を使う必要がありそうだなぁ。
手動で実装する双方向リンクリストだと可能な気がするんで、 std::list に
static な insert(iterator, value_type) や splice() があるといいのかも。そうなると
size() がリストを走査することがほぼ確定するんだけど、現状でもたぶん splice() を
定数時間にするためには避けられないだろうから、あんまり問題なさそう。
0955デフォルトの名無しさん
2008/08/20(水) 20:18:25後者に初めて関数ポインタを見たときのような感動を覚えた
0956デフォルトの名無しさん
2008/08/21(木) 05:40:18struct ab_t {
int a;
int b;
};
int main()
{
st::map<const char*, ab_t> foo;
foo["bar"] = {0, 1};
return 0;
}
としたいんですが、foo["bar"] = {0, 1};の箇所が代入できません。
構造体の初期化とmapへの要素追加を同時に行うには、
どのようにすれば良いでしょうか。
0957デフォルトの名無しさん
2008/08/21(木) 06:33:41コンストラクタ付ければ良くね?
無理なら、struct cab_t : ab_t{ cab_t(){ ... } }; みたいな
ラッパクラス作るとか。
0958デフォルトの名無しさん
2008/08/21(木) 08:26:23foo["bar"] = make_ab_t(0, 1);
0959デフォルトの名無しさん
2008/08/21(木) 09:45:310960デフォルトの名無しさん
2008/08/21(木) 14:35:07コンストラクタを付けられない理由なんてないでしょ。
初期化したいならコンストラクタ、これ常識。
0961デフォルトの名無しさん
2008/08/21(木) 14:49:21この場合にコンストラクタを追加するのに反対するわけじゃないけど、
対象環境によっては POD にしておきたいからコンストラクタを付けられないってことは
めずらしくもない。
0962デフォルトの名無しさん
2008/08/21(木) 15:03:01そう、お前の常識は他人にとっては非常識。
0963デフォルトの名無しさん
2008/08/21(木) 15:17:08STLに使う構造体をPODにする理由について。
0964デフォルトの名無しさん
2008/08/21(木) 15:18:310965デフォルトの名無しさん
2008/08/21(木) 15:28:15んなことどうでもええがな。 >>958のはコンスト有り無し
両回答と解釈できますがな。
0966デフォルトの名無しさん
2008/08/21(木) 17:37:500967デフォルトの名無しさん
2008/08/23(土) 02:53:08そのコンテナが push_back 関数を持っていなければならないと書かれていて、
自作のコンテナ Vec ( vetor に似たクラス)に push_back 関数を実装して
Vec< int > v, u;
v.push_back( 1 );
copy( v.begin(), v.end(), back_inserter( u ) );
というようなコードが出てくるのですが
これを bcc32 や VC2008 でコンパイルすると
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 636: 依存関係にある型限定子 'Vec<int>' に 'const_reference' という名前のメンバー型がない(関数 main() )
(bcc32の場合)
1>c:\program files\microsoft visual studio 9.0\vc\include\iterator(22) : error C2039: 'reference' : 'Vec<T>' のメンバではありません。
(VC2008の場合)
というようになってしまいます。なんででしょう?
っていうか、reference や const_reference なんてメンバ作れとは
Accelerated C++ には一言もかかれてないんだけど・・・。
0968デフォルトの名無しさん
2008/08/23(土) 02:58:430969デフォルトの名無しさん
2008/08/23(土) 03:04:31beginとかendとかはイテレータを返す関数だろ。
例えばbeginの宣言はこうなってるはずだ。
iterator begin();
const_iterator() begin() const();
で、このiterator、const_iteratorはコンテナごとにtypedefしておく必要がある。
0970デフォルトの名無しさん
2008/08/23(土) 03:28:510971デフォルトの名無しさん
2008/08/23(土) 03:29:59>>970はミス。
スルーでお願いします
0972デフォルトの名無しさん
2008/08/23(土) 05:35:30なんでもw
0973970
2008/08/23(土) 08:23:46スルーしてよ><
0974デフォルトの名無しさん
2008/08/23(土) 08:47:240975デフォルトの名無しさん
2008/08/23(土) 09:58:570976デフォルトの名無しさん
2008/08/23(土) 10:02:23> const_iterator() begin() const();
これは無いわw
括弧付けすぎ
0977デフォルトの名無しさん
2008/08/23(土) 10:04:500978デフォルトの名無しさん
2008/08/23(土) 10:22:440979デフォルトの名無しさん
2008/08/23(土) 10:23:530980デフォルトの名無しさん
2008/08/23(土) 10:27:370981デフォルトの名無しさん
2008/08/23(土) 21:46:44#define VARIABLE_A 1
#define VARIABLE_B 2
#define VARIABLE_C 3
・・・
ってA〜Zまで書くのマクロにできない?
0982デフォルトの名無しさん
2008/08/23(土) 21:48:450983デフォルトの名無しさん
2008/08/23(土) 22:02:30#define VARIABLE_1 A
#define VARIABLE_2 B
#define VARIABLE_3 C
こうだ
0984デフォルトの名無しさん
2008/08/23(土) 22:08:14無理
マクロ定義をコンパイル時に生成する手段は無い
それからスレ違い
0985デフォルトの名無しさん
2008/08/23(土) 22:12:360986デフォルトの名無しさん
2008/08/23(土) 22:14:250987981
2008/08/23(土) 22:18:080988デフォルトの名無しさん
2008/08/23(土) 23:48:30さらにcppppのソースをppするppのppが・・・
0989デフォルトの名無しさん
2008/08/24(日) 00:02:170990デフォルトの名無しさん
2008/08/24(日) 01:43:330991デフォルトの名無しさん
2008/08/24(日) 13:25:350992デフォルトの名無しさん
2008/08/24(日) 13:35:04C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/l50
Boost総合スレ part6
http://pc11.2ch.net/test/read.cgi/tech/1207749841/l50
C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/l50
レス数が950を超えています。1000を超えると書き込みができなくなります。