基于循环的范围,带有指向C ++ 11中向量的指针

时间:2015-07-31 10:37:17

标签: c++ c++11 vector

考虑以下示例:

vector<vector<char>*> *outer = new vector<vector<char>*>();
{
    vector<char> *inner = new vector<char>();

    inner->push_back(0);
    inner->push_back(1);
    inner->push_back(2);

    outer->push_back(inner);

    inner->push_back(3);
}

auto x = outer->at(0);

for (auto c : x) {
    cout << c << ",";
}

我想迭代vector<char>*的值;我怎么能做到这一点?

3 个答案:

答案 0 :(得分:6)

为什么不简单地取消引用x

for (auto c : *x) { // Here
    cout << c << ",";
}

通过引用将*x,因此,不会复制。

答案 1 :(得分:2)

x的类型为vector<char>*,因此您需要迭代x指向的内容;你需要取消引用x

for (auto&& c : *x) {
//              ^ dereference the container for a range
//       ^ note the use of &&

作为旁注;

  • 整数值01等的字符不可打印,我可以使用0x31等进行测试,或只是推回字符'0''1'等。
  • 通常最好在基于循环的范围内使用auto&&,以避免在容器返回代理对象时出现副本或细微错误。

答案 2 :(得分:1)

这是一个示范程序

n=1

程序输出

#include <iostream>
#include <vector>
#include <cstring>

int main()
{
    const char *s = "Hello Lu4";
    std::vector<std::vector<char> *> *v = 
        new std::vector<std::vector<char> *>( 1, new std::vector<char>( s, s + std::strlen( s ) ) );

    for ( char c : *( *v )[0] ) std::cout << c;
    std::cout << std::endl;

    for ( auto p : *v ) delete p;
    delete v;
}    

您也可以使用以下循环

Hello Lu4

如果要在演示程序中使用此循环,您将得到与上面相同的结果,因为“外部”向量只包含一个索引为0的元素。