C ++数组[from:to]

时间:2012-04-07 12:24:13

标签: c++ arrays array-splice

我怎么能用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提前 Benecore

2 个答案:

答案 0 :(得分:0)

这是一个函数,它返回一个新的拼接向量,然后给出旧的向量。它只进行最基本的拼接(从:到),并且只在一个方向上进行(不确定是否大于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;
}

答案 1 :(得分:0)

首先,在C ++中没有立即替代它,因为C ++不是python,并且有自己的习惯用法不同。

首先,对于字符串,您可以使用特定的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
  • 也是如此
  • 在为迭代器编写自己的for循环之前先看看the algorithms library
  • 是的,您可以编写自己的for循环(类似于for(auto it = a.begin(); it != a.end(); it++),但通常将函数或lambda传递给std::foreach
  • 更容易,更一致
  • 真的记得C ++不是python,反之亦然。