从整数指针向量打印值

时间:2018-05-01 11:26:08

标签: c++ vector stl

我创建了一个整数向量,如何在向量中取消引用以打印值

data

2 个答案:

答案 0 :(得分:3)

myvector.push_back(&i);不符合你的想法。变量i仅存在于for循环的范围内,因此存储其地址不会按预期工作,并且地址很可能是相同的。这是未定义的行为:

在我的平台上,输出为:

 6 6 6 6 6 

而不是

 1 2 3 4 5

你错过了*(见下面代码中的评论)。所以你可能想要这个:

#include <iostream>
#include <vector>

int main()
{
  std::vector<int*> myvector;
  for (int i = 1; i <= 5; i++) {

    myvector.push_back(new int(i));  // new int() allocated a new pointer to int
                                     // and puts i there
  }
  std::cout << "myvector contains:";

  for (std::vector<int*>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
                   // ^<<<<<<<<<<<< you missed this *
    std::cout << ' ' << **it;
  }
  std::cout << '\n';

  // and now we need to delete the allocted pointers

  for (std::vector<int*>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
    delete *it;
  }

  return 0;
}

但是有一个指向整数的指针向量是没有意义的,你可能只想要一个int的向量。然后你需要这个:

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> myvector;
  for (int i = 1; i <= 5; i++) {

    myvector.push_back(i);
  }
  std::cout << "myvector contains:";

  for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
    std::cout << ' ' << *it;
  }
  std::cout << '\n';

  return 0;
}

在C ++ 11中,您可以编写此代码来迭代向量:

for (auto & i: myvector) {
  std::cout << ' ' << i;
}

这简单得多。

答案 1 :(得分:1)

我希望您只是在达到最小代码时输入错字:myvector.push_back(&1);。所以我跳过它然后继续你的问题。

如果std::vector<int> myvector(问题中):

for (const auto v : myvector){
  std::cout << ' ' << v;
}

如果std::vector<int*> myvector(标题中):

for (const auto p : myvector){
  std::cout << ' ' << *p;
}

<强>更新

myvector.push_back(&i);也不正确。您将指针推送到本地范围的变量i。有两个问题:

  1. 每次迭代都会推送相同的局部变量地址。
  2. for和未定义的行为之后,你会得到悬空指针。