2012-04-07 61 views
0

我該如何在C++中做到這一點? 在巨蟒C++數組[從:到]

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 

我需要從二進制文件的字符串列表,而不使用字符串。 exe文件

THX爲預先 Benecore

+0

既然你解決問題,以C++社區,請解釋一下Python程序做什麼和你有什麼在轉換成C++和麪臨的困難嘗試。 – Mahesh 2012-04-07 12:37:04

回答

0

下面是一個返回一個新的拼接向量GI的函數然後老一個。它只做最基本的拼接(從:到),並且只在一個方向上(不確定from from是否大於,但我相信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; 
} 
0

首先,有在C++中對此沒有立即更換,因爲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])比較,然後,我們將改寫最後聲明是這樣的:

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

假設我們要在最後兩個值,我們會做比較:

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
  • 看看the algorithms library,然後再編寫自己的循環遍歷迭代器。
  • 是的,你可以寫自己的for循環(類似for(auto it = a.begin(); it != a.end(); it++),但往往更容易和更一致的函數或lambda傳遞給std::foreach
  • 真的記得C++沒有Python或反之亦然。
+0

是的,我知道,C++是不是Python,但在Python我寫的應用程序,我可以提取二進制文件/編輯字符串,但我的應用程序有12 MB,因爲是寫在wxPython中,所以我需要它改寫爲C++,但我能找到任何從二進制文件中提取字符串的例子。字符串列表。 – Benecore 2012-04-07 17:45:41

+0

@Benecore這是如何表達python的範圍內運營商在C++ – KillianDS 2012-04-08 14:08:15

+0

是一個完全不同的問題,但我有腳本從二進制文件中提取字符串,我想改寫它,但我不知道有可以重寫陣列 – Benecore 2012-04-08 14:10:43