【问题标题】:Iterating through a std::vector<char>遍历 std::vector<char>
【发布时间】:2020-03-09 21:49:34
【问题描述】:

我有一些旧版 C 遍历分配有一些有效内存的 buffer_1buffer_2 指向 buffer_1 的一部分,并且迭代继续随机移动 20 个位置。以下是代码:

char* buffer_1;
char* buffer_2;
size_t buffer_length;

buffer_length = 2000; // somerandom value

if (buffer_length > 0) {
    buffer_1 = malloc(buffer_length);
    for(buffer_2 = buffer_1; buffer_2 < buffer_1 + buffer_length; buffer_2 += 20) {
        // Some random logic
    }
}

我想通过将buffer_1buffer_2 声明为std::vector&lt;char&gt;s 来使上述代码符合C++ 11,如下所示。

std::vector<char> buffer_1;
std::vector<char> buffer_2;

然后我想我需要在buffer_1 上使用迭代器来执行以下操作?

if (buffer_length > 0) {
    buffer_1.reserve(buffer_length);
    for(std::vector<char>::iterator it = buffer_1.begin(); it != buffer_1.end(); it += 20) {
        buffer_2.data() = *it;
    }
}

上述迭代std::vector&lt;char&gt; 的方法是否正确?它是否与下面的 for 语句完全一样?

for(buffer_2 = buffer_1; buffer_2 < buffer_1 + buffer_length; buffer_2 += 20)

【问题讨论】:

  • 叹息...for(auto it = begin(begin(buffer_1)); it &lt; end(buffer_1); it += 20) {.
  • 它的begin(buffer_1)´ and not begin(begin(buffer_1))`。但我明白了。对不起:-(

标签: c++11 iterator char stdvector


【解决方案1】:

我想让上面的代码符合C++ 11

该代码已经是有效的 C++11。

上述迭代 std::vector 的方法是否正确?它是否与下面的 for 语句完全一样?

没有和没有:

  • 您需要使用resize 而不是reserve
  • 如果缓冲区的大小不是 20 的倍数,它将不起作用。
  • 而这个buffer_2.data() = *it; 没有意义,因为data() 只是一个指向内部缓冲区的指针。

【讨论】:

  • 通过说“我想让代码符合 C++11”,我的意思是让 C++11 完全实现 C 代码正在做的事情。
  • 缓冲区大小是 20 的倍数。我可以肯定这部分,因为它适用于 C 代码。
猜你喜欢
  • 2014-04-12
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多