1

どうすればC++でそれを行うことができますか? pythonでは

example = [u'one', u'two', u'three', u'four']
print example[1:3]

C++でそれを行うにはどうすればよいですか(この関数がありません)これをC++に書き直す必要があります

while i<len(a)-1:
                if (a[i]=='\x00' or a[i]=='\x04') and (eval("0x"+(a[i-1].encode("hex"))) in range(32-(4*eval((a[i].encode("hex")))),128-(12*eval((a[i].encode("hex")))))):
                    st+=a[i-1:i+1]
                    i+=2;continue
                elif st=='':
                    i+=1;continue
                elif len(st)>=4 and (a[i-1:i+1]=='\x00\x00' or a[i-1:i+1]=='\x0a\x00' or a[i-1:i+1]=='\x09\x00' or a[i-1:i+1]=='\x0d\x00'):
                    s.STRINGS.append([st.decode("utf-16le"),0xffffff])
                    s.INDEX.append(iCodeOffset+i-1-len(st))
                    st=''
                    i=i-1;continue
                else:
                    st=''
                    i=i-1;continue

string.exe を使用せずにバイナリ ファイルから文字列のリストが必要です

アドバンスベネコア用THX

4

2 に答える 2

0

これは、古いものに与えられた新しいスプライスされたベクトルを返す関数です。最も基本的なスプライシング(from:to)のみを実行し、一方向にのみ実行します(fromがtoより大きいかどうかはわかりませんが、Pythonは出力を反転すると思います)。

template<typename T>
std::vector<T> splice(const std::vector<T> in, int from, int to)
{
    if (to < from) std::swap(to, from);

    std::vector<T> ret(to - from + 1);

    for (to -= from; to + 1; to--)
    {
        ret[to] = in[from + to];
    }

    return ret;
}
于 2012-04-07T13:17:22.473 に答える
0

まず第一に、C++ は python ではなく、動作が異なる独自のイディオムがあるため、C++ にはこれをすぐに置き換えるものはありません。

まず、文字列には特定のstd::string::substr.

より一般的なコンテナーの場合、C++ は通常、コンテナーの要素を操作するときにイテレーターに基づいて動作することを知っておく必要があります。たとえば、ベクトル内の要素を比較したい場合、次のようにします。

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> a = {1,2,3,4};
    std::vector<int> b = {1,2,10,4};
    std::cout << "Whole vectors equal? " << (std::equal(a.begin(), a.end(), b.begin())?"yes":"no") << std::endl;
}

ここで、最初の 2 つの値 ( など[:2]) のみを比較したい場合、最後のステートメントを次のように書き換えます。

std::cout << "First 2 values equal? " << (std::equal(a.begin(), a.begin()+2, b.begin())?"yes":"no") << std::endl;

最後の 2 つの値を比較したい場合は、次のようにします。

std::cout << "Last 2 values equal? " << (std::equal(a.end()-2, a.end(), b.begin())?"yes":"no") << std::endl;

パターンが出現しているのがわかりますか?x.begin()+i,x.begin()+jにほぼ等しく[i:j]、 にx.end()-i,x.end()-j)ほぼ等しくなり[-i,-j]ます。もちろん、これらを混在させることもできます。

したがって、一般に、コンテナーで作業するときは、一連のイテレーターで作業し、このイテレーターの範囲は、Python のリスト スプライシングと非常によく似た方法で指定できます。これはより冗長で、別のイディオムです (結合されたリストは再びリストですが、反復子はコンテナーではありません) が、同じ結果が得られます。

いくつかの最終的なメモ:

  • x.begin()コードを少しわかりやすくするために書きましstd::begin(x)た。より一般的で、配列でも機能する を書くこともできます。同じことが言えますstd::end
  • イテレータに独自の for ループを記述する前に、アルゴリズム ライブラリを確認してください。
  • はい、独自の for ループを作成できます ( のようなものですfor(auto it = a.begin(); it != a.end(); it++)が、多くの場合、関数またはラムダを渡す方が簡単で一貫性がありますstd::foreach
  • C++ は python ではないこと、またはその逆であることを本当に覚えておいてください。
于 2012-04-07T15:25:35.527 に答える