トップページtech
1001コメント267KB

【C++】STL(Standard Template Library)相談室 2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
前スレ
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/

関連スレなどは>>2以降で
0348デフォルトの名無しさん2005/03/25(金) 01:06:08
>>347
じゃあ92通り目の原因は何?
0349デフォルトの名無しさん2005/03/25(金) 01:40:21
>>348
92行目にtypoがある
0350デフォルトの名無しさん2005/03/25(金) 01:47:15
>>349
じゃあ1273通り目は?
0351デフォルトの名無しさん2005/03/25(金) 02:07:39
1273行目でnewしたポインタのdeleteを忘れてる
0352デフォルトの名無しさん2005/03/25(金) 07:09:07
STLの制限速度の件について
0353デフォルトの名無しさん2005/03/25(金) 08:08:25
糞PCがMAPの処理追いついてないだけじゃないの?



















と適当なこと言ってみる
0354デフォルトの名無しさん2005/03/25(金) 08:11:32
マジレスすると、速度関係ないだろ。
>>338が迷信でプログラミングしてるのが問題。
0355デフォルトの名無しさん2005/03/25(金) 08:14:45
eraseとかしたらiteratorは新しいのに更新せんとあかんのでは?
と適当に言ってみた。
0356デフォルトの名無しさん2005/03/25(金) 08:26:22
一般的に反復子使ってコレクション走査してるときに
コレクションの状態を変えるのはナンセンスだよね
とはいえ、insert_iterator系も用意されてるから一概には言えないけど
0357デフォルトの名無しさん2005/03/25(金) 08:29:26
ライブラリの使い方が間違ってるのを棚に上げて、
AccessViolationをCPUの速度のせいにする。
明らかに切り口の見つけ方がおかしいが、それを自覚しない|できない人間。

>>353も間違いなく>>338と同じ人種。

例えば二日徹夜すると小人さんが代わりにやってくれると信じて、
あえて徹夜で待機するアフォと同レベル。
0358デフォルトの名無しさん2005/03/25(金) 08:38:31
>>357
大量に改行入れてるレスをまじめに受け止めるなって
0359デフォルトの名無しさん2005/03/25(金) 08:55:01
>>356 そうでもないよ。
0360デフォルトの名無しさん2005/03/25(金) 18:51:07
まんこ
0361デフォルトの名無しさん2005/03/27(日) 18:35:32
#include <vector>
using namespace std;

vector<int> a = {2, 20, 3};


こんな感じで vector<int> a を初期化したいのですが、上の文法だとコンパイラーが

error: `a' must be initialized by constructor, not by `{...}'

とエラーを出してきやがります。
本当はどう書いたら良いのでしょうか?
aグローバル変数なのでpush.back()の羅列が出来ません。
だれか助けて。
0362デフォルトの名無しさん2005/03/27(日) 18:44:08
ムリ。
0363デフォルトの名無しさん2005/03/27(日) 19:01:16
>aグローバル変数なのでpush.back()の羅列が出来ません。
はい?
普通にmain()ででもすればいいじゃん。
さもなければ、こんなかんじか。

vector<int> a;
int main()
{
#if 1
static const int aa[] = {2, 20, 3};
a = vector<int>(aa, aa + sizeof(aa) / sizeof(aa[0]));
#else
a.push_back(2);
a.push_back(20);
a.push_back(3);
#endif
...;
return 0;
}
つーか、グローバル変数にしたい理由が判らん。
03643612005/03/27(日) 19:29:02
>>362
む、む、む、無理なんですか!?
実はSTLってたいしたこと無い?

>>363
このvector<int>自体はプログラム全体から参照(read only)するのでグローバルにしたいんですよ。
んでプログラム中で値を変更する事はないから初期化のときに値を入れておくと。

俺のちょー美しい設計がスタートからくずれた…
0365デフォルトの名無しさん2005/03/27(日) 19:33:16
>>364
main()の最初の行にinitialize()っての入れてそこで代入すりゃいいじゃん
0366デフォルトの名無しさん2005/03/27(日) 19:35:26
>>363
単に定数で初期化したいんだろ。
おまえの例示した内容でアフォだってことはわかった。

>>361
vector<int>を派生させるかして、
適当に作成したコンストラクタの引数で初期化しろ。
03673632005/03/27(日) 19:41:44
>>364
グローバル変数なんぞにせず、そう言う値を持つクラスにすればいいじゃん。
そう言う意味では>366の後半。
0368デフォルトの名無しさん2005/03/27(日) 19:44:11
>>362-367
みんなありがとう。でも理解できないでつ。
少なくとも俺の考えた方法は無理だとわかりました。
出直してきます……

0369デフォルトの名無しさん2005/03/27(日) 19:45:44
>>364
read onlyなら普通のconstな配列をグローバル変数にしたら駄目なのか?
なんでvectorにいれる必要があるんだ。
03703612005/03/27(日) 19:53:09
368に名前入れ忘れた。

>>369
うん、普通にconstの配列で良いよ。
単に vector って言ってみたかっただけ。ごめんなさい。ごめんなさい。ごめんなさい。

本当はSTLでかっこよく書いて、あのクソ野郎***をみかえしてやりたかったんだよ……
0371デフォルトの名無しさん2005/03/27(日) 19:54:13
>>361
static int const initial_a[] = {2,20,3};
static int const num_initial_a = sizeof(initial_a) / sizeof(initial_a[0]);
std::vector<int> a(initial_a, initial_a + num_initial_a);

しかし、何がしたいのかわからん。
0372デフォルトの名無しさん2005/03/27(日) 19:57:07
>>370
むしろ無駄が多いだけだろ、それ…。
笑われるぞ。
0373デフォルトの名無しさん2005/03/27(日) 19:57:07
> 本当はSTLでかっこよく書いて、あのクソ野郎***をみかえしてやりたかったんだよ……

この場合は無理にSTL使ったほうがかっこわるい。
クソ野郎じゃなくても「なんでもSTL使えばかっこいいとでも思ってやがる」って言われるのがオチ。
もっと本質を見るようにしような。
03743612005/03/27(日) 20:05:32

Cの配列でも十分だけど vector で定義して for_each でぐるぐる回したらかっこいいと思っただけでつ。

STLを使えるちょーーーーーーー嫌な奴がいて、STLが使えない俺を馬鹿にするんです。
で、俺もSTLぐらい使えるぜと思ったけどレベルが違いすぎました。
アホの子は白鳥にはなれないんですね……
0375デフォルトの名無しさん2005/03/27(日) 20:19:13
あぜ道をスポーツカーで走って物損事故起こすようなマネはせんでいいよ
ちゃんとSTLの趣旨を理解して使ってあげなきゃSTLが可哀想だ
0376デフォルトの名無しさん2005/03/27(日) 20:22:53
>>374 for_each でぐるぐるはCの配列でもできるぞ。
0377デフォルトの名無しさん2005/03/27(日) 20:50:01
そんなんだから馬鹿にされるんだ。
0378デフォルトの名無しさん2005/03/27(日) 20:52:42
こんばんわ
CXSValというクラスを作り、

#include <deque>

template<class T>
class CXSVal{
public:
CXSVal();
~CXSVal();

T Get(int index){
return m_valQueue.at(index);
}

void Set(int index,T val){
m_valQueue.assign(index,val);
}

std::deque<T> m_valQueue;
};
0379デフォルトの名無しさん2005/03/27(日) 20:53:49
もうひとつクラスを作り
class CXSPartsEditer{
public:

struct ORGCHARSET{
ORGCHARSET(){};
~ORGCHARSET(){};

CXSString string;//文字列
CXSVal<int> sizeH;
CXSVal<int> sizeV;//各文字幅
CXSVal<char> DBCSFlag;//SBCS(false)? DBCS(true)?
RECT box;//ラインのRECTサイズ
int numCntMax;//最大文字数
int numCntMax_wide;//最大ワイド文字数
int boundsWidthMax;//合計された最大文字列幅
int boundsHeightMin;//文字列における垂直方向の最小幅
int boundsHeightMax;//文字列における垂直方向の最大幅
};

(省略)
ORGCHARSET m_CHSET[256];
(省略)
};
0380デフォルトの名無しさん2005/03/27(日) 20:56:05
これをビルドしたさい、下記のエラーが出てしまいます。
ConsoleAppMg error LNK2019: 未解決の外部シンボル "public: __thiscall CXSVal<int>::~CXSVal<int>(void)"
(??1?$CXSVal@H@@QAE@XZ) が関数 __unwindfunclet$??0ORGCHARSET@CXSPartsEditer@@QAE@XZ$0 で参照されました。
ConsoleAppMg error LNK2019: 未解決の外部シンボル "public: __thiscall CXSVal<char>::CXSVal<char>(void)"
(??0?$CXSVal@D@@QAE@XZ) が関数 "public: __thiscall CXSPartsEditer::ORGCHARSET::ORGCHARSET(void)" (??0ORGCHARSET@CXSPartsEditer@@QAE@XZ) で参照されました。
ConsoleAppMg error LNK2019: 未解決の外部シンボル "public: __thiscall CXSVal<int>::CXSVal<int>(void)"
(??0?$CXSVal@H@@QAE@XZ) が関数 "public: __thiscall CXSPartsEditer::ORGCHARSET::ORGCHARSET(void)"
(??0ORGCHARSET@CXSPartsEditer@@QAE@XZ) で参照されました。
ConsoleAppMg error LNK2019: 未解決の外部シンボル "public: __thiscall CXSVal<char>::~CXSVal<char>(void)"
(??1?$CXSVal@D@@QAE@XZ) が関数 "public: __thiscall CXSPartsEditer::ORGCHARSET::~ORGCHARSET(void)" (??1ORGCHARSET@CXSPartsEditer@@QAE@XZ) で参照されました。
ConsoleAppMg fatal error LNK1120: 外部参照 4 が未解決です。

これはなぜ起きるのでしょうか?
初心者なため難しいです。
数時間ほど考えましたがわかりません。
わかるかたがいらっしゃいましたら、お教えいただけないでしょうか。
0381デフォルトの名無しさん2005/03/27(日) 20:56:57
開発ソフトは、VisualStudio.net(C++)です。
0382デフォルトの名無しさん2005/03/27(日) 21:03:38
>>380
あなたが利用したい関数がリンカが参照できる位置にないってことでしょ
必要なライブラリはパス上にあるの?
0383デフォルトの名無しさん2005/03/27(日) 21:04:50
ごめん、見当違いな事書いてるな、おれ
0384デフォルトの名無しさん2005/03/27(日) 21:10:06
ここに問題があるっぽい。

typedef struct tagORGCHARSET{
CXSString string;//文字列
CXSVal<int> sizeH;
CXSVal<int> sizeV;//各文字幅
CXSVal<char> DBCSFlag;//SBCS(false)? DBCS(true)?
RECT box;//ラインのRECTサイズ
int numCntMax;//最大文字数
int numCntMax_wide;//最大ワイド文字数
int boundsWidthMax;//合計された最大文字列幅
int boundsHeightMin;//文字列における垂直方向の最小幅
int boundsHeightMax;//文字列における垂直方向の最大幅
}ORGCHARSET;

STLは勉強したばかりなので、どこに問題があるのかの特定が難しいです。
構造体の中でSTLを用いてはいけないのでしょうか?
03853632005/03/27(日) 21:11:57
>>374
例えば整数配列から値を検索するのにstd::find()をどう使えばいいか覚えてみたらどうだ?
君の例ならこんなもんだぞ。

static const int a[] = {2, 20, 3};

size_t length_of_a = sizeof(a) / sizeof(*a);
const int * it = std::find(a, a + length_of_a, 200);
if (it == a + length_of_a) {
std::cout << "Oops!\n";
} else {
std::cout << "Whee!\n";
}
03863632005/03/27(日) 21:12:49
>>378
~CXSVal();
の実体はどこ?
0387デフォルトの名無しさん2005/03/27(日) 21:19:29
>>378-380
CXSVal のコンストラクタ、デストラクタが宣言されただけで定義されて無いから。

なんでこのスレで聞いたんだろう?
0388デフォルトの名無しさん2005/03/27(日) 21:24:46
>>378
CXSValクラスの実装を *.cpp に書いてたらリンクが通らないので確認を。
03893782005/03/27(日) 21:47:53
>>386 >>387
それはXSVal.cppで定義されてます。

もう少し考えてみたいと思います。
ありがとうございました。
0390デフォルトの名無しさん2005/03/28(月) 00:48:10
>>389
export されていない関数(メンバ関数)テンプレートの定義は
インスタンス化されるコンパイル単位に含まれる必要がある。

たぶん export は使えないから、定義もヘッダに含めてしまうのが現状では一般的。
0391デフォルトの名無しさん2005/03/28(月) 00:53:33
361は単にシングルトンつかえばいいだけだろ

const std:vector<int> a& = create_a();

static const std::vector<int>& create_a()
{
 static std::vector<int> &a;
 a.push_back(...);
 a.push_back(...);
 a.push_back(...);
 return a;
}

これなら、コンストラクタにも縛られんし
0392デフォルトの名無しさん2005/03/28(月) 00:54:49
参照がらみでタイプミスった罠 orz
0393デフォルトの名無しさん2005/03/28(月) 01:03:54
>>391
少々スレ違いだが、boostに同様のものがある。
#include <boost/assign/list_of.hpp>

const std::vector<int> a = list_of(2)(20)(3);
0394デフォルトの名無しさん2005/03/28(月) 11:18:25
mapのoperator[]ってキーが存在しないときの戻り値は未定義ですか?
それとも、必ず0が返るとかみたいに決まってますか?
0395デフォルトの名無しさん2005/03/28(月) 12:09:32
>>394
先ず本を読め。
0396デフォルトの名無しさん2005/03/28(月) 12:29:48
>>394
T()が返る
0397デフォルトの名無しさん2005/03/28(月) 13:13:06
>>394 の様な質問をする輩に T() が解るとも思えんが。
0398デフォルトの名無しさん2005/03/28(月) 13:39:22
T() が分からない香具師がそもそも map なんか知(ry
0399デフォルトの名無しさん2005/03/28(月) 16:01:15
今後の勉強のタメにT()を教えてください
0400デフォルトの名無しさん2005/03/28(月) 16:07:21
別に NULLPO() でもいいんだけどな
0401デフォルトの名無しさん2005/03/28(月) 16:21:01
デフォルトコンストラクタの結果が返るとか書けばいいだけでは?
組み込み型は0だな
0402デフォルトの名無しさん2005/03/28(月) 16:24:56
初期値でいいんだよ
あとGA()でもいいな
0403デフォルトの名無しさん2005/03/28(月) 19:43:12
>>394
デフォルトコンストラクタの結果への参照が返る。
0404デフォルトの名無しさん2005/03/28(月) 23:30:23
T()じゃ一時オブジェクトじゃん
返すのはT&だよ。
0405デフォルトの名無しさん2005/03/28(月) 23:38:35
正確に言えばT()を挿入してそこへの参照を返すといったところかな。
0406デフォルトの名無しさん2005/03/28(月) 23:58:06
キャーのび太さんのエッチ!
0407デフォルトの名無しさん2005/03/29(火) 12:09:32
ある一つのプログラムの中で
あるクラスのメンバ変数としてm_strAppPathをstringで定義し

  char szAppPath[MAX_PATH];
  GetModuleFileName(NULL, szAppPath, MAX_PATH);
  m_strAppPath = szAppPath;
  m_strAppPath = m_strAppPath.substr(0, (m_strAppPath.rfind('\\')+1));

としてアプリケーションのパスを保持しています。
この部分は期待通りに動作しているのですが、
上のコードがある物とは別のクラスのソースファイルの中で
strFileと言う変数をstringで定義し、GetOpenFileNameでstrFileにファイル名を取得し、

  strFile = strFile.substr(0, x);  ←xの値は任意

とすると、上のm_strAppPathと違ってstrFileがNULLになってしまいます
同じことをしているだけなのになぜ結果がおかしくなるんでしょうか・・・
0408デフォルトの名無しさん2005/03/29(火) 16:42:46
>>407
strFileが初めから空ではないかと言ってみる。
04094072005/03/29(火) 17:32:04
いえ、ちゃんとデータ入れてました
デバッグでもちゃんとデータが入ってるのは確認しましたし

色々やっててやっと原因がわかったんですが
lstrcpy((char*)strFile.begin(), 別のstring変数のポインタ);
としてやってたのがいけなかったようです
size()の返値が0になってました・・・
直接コピーはダメなんですね・・・
0410デフォルトの名無しさん2005/03/29(火) 17:35:41
それはやばい
0411デフォルトの名無しさん2005/03/29(火) 18:01:34
むしろstrcpy推薦
0412デフォルトの名無しさん2005/03/29(火) 18:38:21
あちこちで推薦して歩くなよw
0413デフォルトの名無しさん2005/03/30(水) 02:32:32
>>409
basic_string<>に直接コピーすると内部でのデータ構造が破壊される
虞がある。そもそもbasic_string<>::begin()が返すのはbasic_string<>::iterator
であって、char*ではない。basic_string<>::iteratorがchar*で実装されている
「可能性もある」にすぎないし、かなりの数の実装ではそうではない。
0414デフォルトの名無しさん2005/03/30(水) 19:14:59
>>409
strFile = 別の string 変数

にしなかった理由を知りたい。
0415デフォルトの名無しさん2005/03/30(水) 19:21:41
GetOpenFileNameに渡したりしてたから
0416デフォルトの名無しさん2005/03/30(水) 23:26:37
こんばんわ
std::wstring m_string;
wchar_t* pWC=m_string.c_str();

このpWCに直接アクセスしてもいいのでしょうか?
たとえば、strcpyなどで文字列をコピーしたり。
0417デフォルトの名無しさん2005/03/30(水) 23:52:19
読むのはいいけど書いちゃダメ
0418デフォルトの名無しさん2005/03/31(木) 00:16:35
そもそもコンパイルが通らない気が…

const wchar_t* ならわかるけど
0419デフォルトの名無しさん2005/03/31(木) 10:15:43
Win32APIにstringオブジェクトを渡して使ってもらうことはできないんでしょうか
一旦別のchar変数に受け取ってから代入するしか無いんでしょうか
0420デフォルトの名無しさん2005/03/31(木) 10:27:13
どの辺がSTL?
0421デフォルトの名無しさん2005/03/31(木) 10:33:02
stringがSTL
0422デフォルトの名無しさん2005/03/31(木) 10:41:17
c_str()を呼んで、const char * を渡せばいいだけでは?
0423デフォルトの名無しさん2005/03/31(木) 10:53:50
何故stringのキャストは高機能じゃないの?
例えば、
int a=10

string(a)
は何故できない?
0424デフォルトの名無しさん2005/03/31(木) 11:06:43
>>423
string の機能とする必要がないからだろうな。
0425デフォルトの名無しさん2005/03/31(木) 11:41:27
>>424
確かにもう少し冗長な方法で、変換できますが。
borlandのAnsiStringやMFCのCStringではできるのに、stlがサポートしなかったのは、どうしてなのでしょうか?
0426デフォルトの名無しさん2005/03/31(木) 12:02:24
>>425
「便利な文字列型」と「標準の文字列型」の違いがあるからだろうな。
0427デフォルトの名無しさん2005/03/31(木) 12:04:16
>>423
最近はそーゆーのも「キャスト」と呼ぶんですか。
(´・∀・`)ヘー
0428デフォルトの名無しさん2005/03/31(木) 12:18:56
>>418
そこで、const_castですよ
0429デフォルトの名無しさん2005/03/31(木) 13:27:39
>>425
暗黙の型変換を許したくなかったんじゃまいか
0430デフォルトの名無しさん2005/03/31(木) 13:53:39
>>429
それならexplicitで十分。たぶん>>426のようなことだと思う。
0431デフォルトの名無しさん2005/03/31(木) 14:10:41
basic_string クラスっつーくらいだからな。
0432デフォルトの名無しさん2005/03/31(木) 14:21:10
stringstreamを使えってことか
0433デフォルトの名無しさん2005/03/31(木) 14:33:30
basic_stringはSTLではないんだけどね、ホントは
0434デフォルトの名無しさん2005/03/31(木) 16:08:05
>>423
boost::lexical_cast
0435デフォルトの名無しさん2005/03/31(木) 17:34:58
>>433
STL が何か解ってない >>1 が勃てた重複スレで
その指摘はどうだろう。
0436デフォルトの名無しさん2005/04/05(火) 00:17:02
イテレータからポインタに変換するいい方法はないでしょうか?
現在,

hoge::iterator it;

をポインタに変換するのに

&*it

としていますが,あんましいい方法じゃない気がするので….
0437デフォルトの名無しさん2005/04/05(火) 00:36:07
>>436 なにが気に入らない?
0438デフォルトの名無しさん2005/04/05(火) 04:52:01
>>436
template <typename Target, typename Source>
inline Target* iterator_cast(Source source)
{ return &*source; }

hoge<T>::iterator it;
T* t = iterator_cast<T>(it);

だったらこんなんどう?
オレはこんなのオススメしないけど
0439デフォルトの名無しさん2005/04/05(火) 07:43:24
>393
boostなら、boost::arrayがあるじゃあないか
0440デフォルトの名無しさん2005/04/05(火) 13:03:38
hoge<T>::iterator it;

boost::addressof(*it);
0441デフォルトの名無しさん2005/04/05(火) 23:19:52
いずれにせよ、見やすくなるわけでもないのに長くなるな。
04424362005/04/05(火) 23:39:40
VC6だと

hoge<T>::iterator it;
T *p = (T*)it;

みたいなのが普通に通ってたんですけど,
VC7に移行したとたんエラーが出て通らなくなっちゃいました.
もしかして,この書き方はVC6専用??
0443デフォルトの名無しさん2005/04/05(火) 23:45:01
>>442
VC6 と VC7 の両方で
std::cout << typeid(hoge<T>::iterator).name();
を実行して見れ
0444デフォルトの名無しさん2005/04/06(水) 00:50:08
>>442
イテレータがポインタで実装されている保証はないから、そういうコードは書いちゃダメだろ
0445デフォルトの名無しさん2005/04/06(水) 01:15:36
>>442 Cスタイルキャストイクナイ
0446デフォルトの名無しさん2005/04/06(水) 04:39:11
>>442
これはひどい
0447デフォルトの名無しさん2005/04/06(水) 05:12:25
ごめんね、お母さん初めてキャストしたから(ry
■ このスレッドは過去ログ倉庫に格納されています