以下是代码段,我想将first
变量指向second
变量而不复制向量:
#include <iostream>
#include <vector>
std::vector<int> second (4,100);
void modify(std::vector<int>* i) {
i = &second;
}
int main ()
{
std::vector<int> first; // empty vector of ints
modify(&first);
for (std::vector<int>::iterator it = first.begin(); it != first.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
输出为空,而我期望输出为100 100 100 100
。
有没有人知道为什么我不能像这样修改矢量?
答案 0 :(得分:2)
您按值传递指针。这意味着在函数外部不会看到任何更改指向函数的指针。如果要查看调用站点中的更改,您需要做的是通过引用传递指针。在这种情况下,这不起作用,因为
modify(&first);
是一个右值指针,不能绑定到非常量左值引用。
所有这些都不需要。我们可以改变函数来获取像
这样的引用void modify(std::vector<int>& i) {
i = second;
}
然后modify(&first);
变为modify(first);
,现在更改将反映在main()
中。
答案 1 :(得分:0)
看起来你想要这个:
void modify(std::vector<int>* i) {
*i = second;
}
它已经老了&#34;通过参数修改值的方法可能有问题:
void modify(std::vector<int>* i) {
if( !i ) {
// what should I do?
throw std::runtime_exception( "cannot modify vector through nullptr" );
}
*i = second;
}
这个额外的检查可以使用引用来避免,这也会使你的意图更清楚地告诉代码的读者,除非你真的想有时因某种原因传递nullptr
(告诉函数不要改变值,但是做其他事情,例如)。