【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じゃあ92通り目の原因は何?
0349デフォルトの名無しさん
2005/03/25(金) 01:40:2192行目にtypoがある
0350デフォルトの名無しさん
2005/03/25(金) 01:47:15じゃあ1273通り目は?
0351デフォルトの名無しさん
2005/03/25(金) 02:07:390352デフォルトの名無しさん
2005/03/25(金) 07:09:070353デフォルトの名無しさん
2005/03/25(金) 08:08:25と適当なこと言ってみる
0354デフォルトの名無しさん
2005/03/25(金) 08:11:32>>338が迷信でプログラミングしてるのが問題。
0355デフォルトの名無しさん
2005/03/25(金) 08:14:45と適当に言ってみた。
0356デフォルトの名無しさん
2005/03/25(金) 08:26:22コレクションの状態を変えるのはナンセンスだよね
とはいえ、insert_iterator系も用意されてるから一概には言えないけど
0357デフォルトの名無しさん
2005/03/25(金) 08:29:26AccessViolationをCPUの速度のせいにする。
明らかに切り口の見つけ方がおかしいが、それを自覚しない|できない人間。
>>353も間違いなく>>338と同じ人種。
例えば二日徹夜すると小人さんが代わりにやってくれると信じて、
あえて徹夜で待機するアフォと同レベル。
0358デフォルトの名無しさん
2005/03/25(金) 08:38:31大量に改行入れてるレスをまじめに受け止めるなって
0359デフォルトの名無しさん
2005/03/25(金) 08:55:010360デフォルトの名無しさん
2005/03/25(金) 18:51:070361デフォルトの名無しさん
2005/03/27(日) 18:35:32using 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:080363デフォルトの名無しさん
2005/03/27(日) 19:01:16はい?
普通に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;
}
つーか、グローバル変数にしたい理由が判らん。
0364361
2005/03/27(日) 19:29:02む、む、む、無理なんですか!?
実はSTLってたいしたこと無い?
>>363
このvector<int>自体はプログラム全体から参照(read only)するのでグローバルにしたいんですよ。
んでプログラム中で値を変更する事はないから初期化のときに値を入れておくと。
俺のちょー美しい設計がスタートからくずれた…
0365デフォルトの名無しさん
2005/03/27(日) 19:33:16main()の最初の行にinitialize()っての入れてそこで代入すりゃいいじゃん
0366デフォルトの名無しさん
2005/03/27(日) 19:35:26単に定数で初期化したいんだろ。
おまえの例示した内容でアフォだってことはわかった。
>>361
vector<int>を派生させるかして、
適当に作成したコンストラクタの引数で初期化しろ。
0368デフォルトの名無しさん
2005/03/27(日) 19:44:11みんなありがとう。でも理解できないでつ。
少なくとも俺の考えた方法は無理だとわかりました。
出直してきます……
0369デフォルトの名無しさん
2005/03/27(日) 19:45:44read onlyなら普通のconstな配列をグローバル変数にしたら駄目なのか?
なんでvectorにいれる必要があるんだ。
0370361
2005/03/27(日) 19:53:09>>369
うん、普通にconstの配列で良いよ。
単に vector って言ってみたかっただけ。ごめんなさい。ごめんなさい。ごめんなさい。
本当はSTLでかっこよく書いて、あのクソ野郎***をみかえしてやりたかったんだよ……
0371デフォルトの名無しさん
2005/03/27(日) 19:54:13static 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むしろ無駄が多いだけだろ、それ…。
笑われるぞ。
0373デフォルトの名無しさん
2005/03/27(日) 19:57:07この場合は無理にSTL使ったほうがかっこわるい。
クソ野郎じゃなくても「なんでもSTL使えばかっこいいとでも思ってやがる」って言われるのがオチ。
もっと本質を見るようにしような。
0374361
2005/03/27(日) 20:05:32Cの配列でも十分だけど vector で定義して for_each でぐるぐる回したらかっこいいと思っただけでつ。
STLを使えるちょーーーーーーー嫌な奴がいて、STLが使えない俺を馬鹿にするんです。
で、俺もSTLぐらい使えるぜと思ったけどレベルが違いすぎました。
アホの子は白鳥にはなれないんですね……
0375デフォルトの名無しさん
2005/03/27(日) 20:19:13ちゃんとSTLの趣旨を理解して使ってあげなきゃSTLが可哀想だ
0376デフォルトの名無しさん
2005/03/27(日) 20:22:530377デフォルトの名無しさん
2005/03/27(日) 20:50:010378デフォルトの名無しさん
2005/03/27(日) 20:52:42CXSValというクラスを作り、
#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:49class 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:05ConsoleAppMg 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:570382デフォルトの名無しさん
2005/03/27(日) 21:03:38あなたが利用したい関数がリンカが参照できる位置にないってことでしょ
必要なライブラリはパス上にあるの?
0383デフォルトの名無しさん
2005/03/27(日) 21:04:500384デフォルトの名無しさん
2005/03/27(日) 21:10:06typedef 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を用いてはいけないのでしょうか?
0385363
2005/03/27(日) 21:11:57例えば整数配列から値を検索するのに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";
}
0387デフォルトの名無しさん
2005/03/27(日) 21:19:29CXSVal のコンストラクタ、デストラクタが宣言されただけで定義されて無いから。
なんでこのスレで聞いたんだろう?
0388デフォルトの名無しさん
2005/03/27(日) 21:24:46CXSValクラスの実装を *.cpp に書いてたらリンクが通らないので確認を。
0390デフォルトの名無しさん
2005/03/28(月) 00:48:10export されていない関数(メンバ関数)テンプレートの定義は
インスタンス化されるコンパイル単位に含まれる必要がある。
たぶん export は使えないから、定義もヘッダに含めてしまうのが現状では一般的。
0391デフォルトの名無しさん
2005/03/28(月) 00:53:33const 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:490393デフォルトの名無しさん
2005/03/28(月) 01:03:54少々スレ違いだが、boostに同様のものがある。
#include <boost/assign/list_of.hpp>
const std::vector<int> a = list_of(2)(20)(3);
0394デフォルトの名無しさん
2005/03/28(月) 11:18:25それとも、必ず0が返るとかみたいに決まってますか?
0395デフォルトの名無しさん
2005/03/28(月) 12:09:32先ず本を読め。
0396デフォルトの名無しさん
2005/03/28(月) 12:29:48T()が返る
0397デフォルトの名無しさん
2005/03/28(月) 13:13:060398デフォルトの名無しさん
2005/03/28(月) 13:39:220399デフォルトの名無しさん
2005/03/28(月) 16:01:150400デフォルトの名無しさん
2005/03/28(月) 16:07:210401デフォルトの名無しさん
2005/03/28(月) 16:21:01組み込み型は0だな
0402デフォルトの名無しさん
2005/03/28(月) 16:24:56あとGA()でもいいな
0403デフォルトの名無しさん
2005/03/28(月) 19:43:12デフォルトコンストラクタの結果への参照が返る。
0404デフォルトの名無しさん
2005/03/28(月) 23:30:23返すのはT&だよ。
0405デフォルトの名無しさん
2005/03/28(月) 23:38:350406デフォルトの名無しさん
2005/03/28(月) 23:58:060407デフォルトの名無しさん
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:46strFileが初めから空ではないかと言ってみる。
0409407
2005/03/29(火) 17:32:04デバッグでもちゃんとデータが入ってるのは確認しましたし
色々やっててやっと原因がわかったんですが
lstrcpy((char*)strFile.begin(), 別のstring変数のポインタ);
としてやってたのがいけなかったようです
size()の返値が0になってました・・・
直接コピーはダメなんですね・・・
0410デフォルトの名無しさん
2005/03/29(火) 17:35:410411デフォルトの名無しさん
2005/03/29(火) 18:01:340412デフォルトの名無しさん
2005/03/29(火) 18:38:210413デフォルトの名無しさん
2005/03/30(水) 02:32:32basic_string<>に直接コピーすると内部でのデータ構造が破壊される
虞がある。そもそもbasic_string<>::begin()が返すのはbasic_string<>::iterator
であって、char*ではない。basic_string<>::iteratorがchar*で実装されている
「可能性もある」にすぎないし、かなりの数の実装ではそうではない。
0414デフォルトの名無しさん
2005/03/30(水) 19:14:59strFile = 別の string 変数
にしなかった理由を知りたい。
0415デフォルトの名無しさん
2005/03/30(水) 19:21:410416デフォルトの名無しさん
2005/03/30(水) 23:26:37std::wstring m_string;
wchar_t* pWC=m_string.c_str();
このpWCに直接アクセスしてもいいのでしょうか?
たとえば、strcpyなどで文字列をコピーしたり。
0417デフォルトの名無しさん
2005/03/30(水) 23:52:190418デフォルトの名無しさん
2005/03/31(木) 00:16:35const wchar_t* ならわかるけど
0419デフォルトの名無しさん
2005/03/31(木) 10:15:43一旦別のchar変数に受け取ってから代入するしか無いんでしょうか
0420デフォルトの名無しさん
2005/03/31(木) 10:27:130421デフォルトの名無しさん
2005/03/31(木) 10:33:020422デフォルトの名無しさん
2005/03/31(木) 10:41:170423デフォルトの名無しさん
2005/03/31(木) 10:53:50例えば、
int a=10
で
string(a)
は何故できない?
0424デフォルトの名無しさん
2005/03/31(木) 11:06:43string の機能とする必要がないからだろうな。
0425デフォルトの名無しさん
2005/03/31(木) 11:41:27確かにもう少し冗長な方法で、変換できますが。
borlandのAnsiStringやMFCのCStringではできるのに、stlがサポートしなかったのは、どうしてなのでしょうか?
0426デフォルトの名無しさん
2005/03/31(木) 12:02:24「便利な文字列型」と「標準の文字列型」の違いがあるからだろうな。
0427デフォルトの名無しさん
2005/03/31(木) 12:04:16最近はそーゆーのも「キャスト」と呼ぶんですか。
(´・∀・`)ヘー
0428デフォルトの名無しさん
2005/03/31(木) 12:18:56そこで、const_castですよ
0429デフォルトの名無しさん
2005/03/31(木) 13:27:39暗黙の型変換を許したくなかったんじゃまいか
0430デフォルトの名無しさん
2005/03/31(木) 13:53:39それならexplicitで十分。たぶん>>426のようなことだと思う。
0431デフォルトの名無しさん
2005/03/31(木) 14:10:410432デフォルトの名無しさん
2005/03/31(木) 14:21:100433デフォルトの名無しさん
2005/03/31(木) 14:33:300434デフォルトの名無しさん
2005/03/31(木) 16:08:05boost::lexical_cast
0435デフォルトの名無しさん
2005/03/31(木) 17:34:58STL が何か解ってない >>1 が勃てた重複スレで
その指摘はどうだろう。
0436デフォルトの名無しさん
2005/04/05(火) 00:17:02現在,
hoge::iterator it;
をポインタに変換するのに
&*it
としていますが,あんましいい方法じゃない気がするので….
0437デフォルトの名無しさん
2005/04/05(火) 00:36:070438デフォルトの名無しさん
2005/04/05(火) 04:52:01template <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:24boostなら、boost::arrayがあるじゃあないか
0440デフォルトの名無しさん
2005/04/05(火) 13:03:38boost::addressof(*it);
0441デフォルトの名無しさん
2005/04/05(火) 23:19:520442436
2005/04/05(火) 23:39:40hoge<T>::iterator it;
T *p = (T*)it;
みたいなのが普通に通ってたんですけど,
VC7に移行したとたんエラーが出て通らなくなっちゃいました.
もしかして,この書き方はVC6専用??
0443デフォルトの名無しさん
2005/04/05(火) 23:45:01VC6 と VC7 の両方で
std::cout << typeid(hoge<T>::iterator).name();
を実行して見れ
0444デフォルトの名無しさん
2005/04/06(水) 00:50:08イテレータがポインタで実装されている保証はないから、そういうコードは書いちゃダメだろ
0445デフォルトの名無しさん
2005/04/06(水) 01:15:360446デフォルトの名無しさん
2005/04/06(水) 04:39:11これはひどい
0447デフォルトの名無しさん
2005/04/06(水) 05:12:25■ このスレッドは過去ログ倉庫に格納されています