C++11中使用指向向量的指针的范围for循环

3
考虑以下例子:
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>*的值;我该怎么做?

8
这是糟糕的、糟糕的代码。至少要使用 unique_ptr 而不是拥有原始指针。更好的做法是完全摆脱不必要的 new - T.C.
上一次我打开C++的书大概是在C++98之前,这样的代码还算正常...))) 谢谢,我会看一下unique_ptr的... - Lu4
基本上这甚至不是关于原始指针的问题。它关于在第一次使用new - Sambuca
它被用来说明问题,但是它(一般而言)有什么问题? - Lu4
使用vector<vector<char>> outer;代替vector<vector<char>*> outer = new vector<vector<char>>(); - Marian Spanik
我担心在执行以下操作时无意中复制向量:for (auto x : vector_vector_var) { ... } - Lu4
3个回答

9
为什么你不直接取消引用 x
for (auto c : *x) { // Here
    cout << c << ",";
}

它将按引用传递*x,因此不会进行复制。


它会产生原始向量的副本吗? - Lu4
1
不会,它会通过引用来获取它。 - Telokis
4
“它将通过引用来获取。” 这个观点有任何参考资料吗?谢谢。 - crafet

3

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
这里有一个示范程序。
#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

你可以使用以下循环:
for ( auto inner : *v )
{
    for ( char c : *inner ) std::cout << c;
    std::cout << std::endl;
}        

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接