c++如何求解:引用非常量的初始值必须是左值
c++ How to solve : Initial value of reference to non-const must be an lvalue
我正在编写一个程序来确定一系列数字的质因数。在程序中,范围的startingNumber
和endingNumber
表示为std::pair
。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const long long MAX = 100000000; // One hundred million
long long factor[MAX];
pair<const long long, const long long> get_pair() // Gets user start and end number to establish range in vector.
{
long long largestNumber = 100000000;
long long smallestNumber = 2;
std::pair<long long, long long> p;
cout << "Enter a start number: ";
cin >> p.first;
while (p.first < smallestNumber || p.first > largestNumber || cin.fail()) {
cin.clear();
cin.ignore(1000, 'n');
cout << "That's not a valid choice. Please try again (" << smallestNumber << " - " << largestNumber << "): ";
cin >> p.first;
}
cout << "Enter a end number: ";
cin >> p.second;
while (p.second < p.first || p.second > largestNumber || cin.fail()) {
cin.clear();
cin.ignore(1000, 'n');
cout << "That's not a valid choice. Please try again (" << p.first << " - " << largestNumber << "): ";
cin >> p.second;
}
cout << endl;
return make_pair(p.first, p.second);
}
vector<long long> rangeToVector(const long long &startingNumber, const long long &endingNumber) // creates vector of numbers from std::pair.
{
vector<long long> iterator;
for (long long i = 1; i <= ((10 - 1) + 1); i += 1) iterator.push_back((1-1)+i);
return iterator;
}
void precalculate() // Calculates all of the prime numbers between 1 and MAX. Stores prime numbers from smallest to largest.
{
for (long long i = 1; i < MAX; i++) { // stores 1 through Max in factor.
factor[i] = i;
}
for (long long i = 2; i * i < MAX; i++) if (factor[i] == i) { // If factor[i] is even.
for (long long j = i + i; j < MAX; j += i) {
factor[j] = i;
}
}
}
上面的代码按预期工作。然后将代码输入到以下函数中,我不确定 or 是否正常工作(因为我在 main 中的函数将无法编译(。
vector<long long> get_factors(vector<long long> &vect) // performs calculation on rangeToVector[i] (determined by precalculate) until it is not divisible, then it returns those that were divided into the number as prime factors of the rangeToVector[i].
{
vector<long long> factors;
for (auto i : vect)
{
while (vect[i] > 1)
{
long long f = factor[vect[i]];
factors.push_back(f);
vect[i] /=f;
}
}
sort(factors.begin(), factors.end()); // sorts the vector.
factors.erase(unique(factors.begin(), factors.end()), factors.end()); // erases duplicates (requires sorted vector).
return factors;
}
在 main(第 3 行(中,我收到错误下划线rangeToVector
、initial value of reference to non-const must be an lvalue
。
int main()
{
for (auto i : get_factors(rangeToVector(pairs.first, pairs.second))) // get_factors returns factors of numbers in vector rangeToVector
{
cout << i << " ";
}
system("pause");
return 0;
}
我试图在rangeToVector
常量中生成值,但这并没有解决问题。我的问题是,我的引用不正确吗?我应该以不同的方式传递函数吗?或者我可以对代码做些什么,以允许get_factors
在第 3 行的 main 中获取rangeToVector[i]
的因素。我是 c++ 的新手,所以任何帮助将不胜感激。
你的问题就在这里:
std::vector<long long> get_factors(std::vector<long long> &vect) { ... }
变量vect
是一个左值引用,这意味着它是一个不能绑定到临时变量的引用。
然而,你这样使用它:
get_factors(rangeToVector(...))
其中rangeToVector
返回临时。
解决方案是简单地将vect
设置为常量左值引用,该引用可以绑定到临时
// const here -------v
std::vector<long long> get_factors(std::vector<long long> const& vect) { ... }
你的代码中还有许多其他问题,我建议你阅读一篇好C++,尽量不要假设它的语法。例如,您没有正确使用循环的范围:
for (auto i : vect) {
while (vect[i] > 1) {
long long f = factor[vect[i]];
factors.push_back(f);
vect[i] /=f;
}
}
正确的用法是:
for (auto& i : vect) {
while (i > 1) {
long long f = factor[i];
factors.push_back(f);
i /= f;
}
}
首先,我要感谢大家的意见和建议,它帮助我解决了我的问题。正如纪尧姆·拉西科特(Guillaume Racicot(所提到的,我肯定需要更多地研究载体。再次,谢谢。
我的问题在下面的代码中:
vector<long long> get_factors(vector<long long> &vect) // Notice how I have it relying on "vector<long long> &vect".
{
vector<long long> factors;
for (auto i : vect)
{
while (vect[i] > 1)
{
long long f = factor[vect[i]];
factors.push_back(f);
vect[i] /=f;
}
}
sort(factors.begin(), factors.end()); // sorts the vector.
factors.erase(unique(factors.begin(), factors.end()), factors.end()); // erases duplicates (requires sorted vector).
return factors;
}
以及我在 main 中调用它的方式:
for (auto i : get_factors(rangeToVector(pairs.first, pairs.second))) // get_factors returns factors of numbers in vector rangeToVector
{
cout << i << " ";
}
为了解决我的问题,我需要意识到,为了访问向量/数组,你必须创建一个 for 循环来收集其值。因此,我的解决方案如下。
vector<long long> get_factors(long long x, vector<long long> vec )
{
vector<long long> factors;
while (x > 1) { /* insert code*/ vec.push_back(f); } // Or use a for loop.
return vec;
}
int main(int argc, const char * argv[]) {
vector<long long> temp1;
for (long long val : inputVector) // where initial data was stored (see original post)
{
result1 = getPrimes(val, temp1); // iterate through vec as long long in function
}
return 0;
}
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- c++如何求解:引用非常量的初始值必须是左值
- *val 和 &val 在 C++ 中通过引用传递时有何不同
- 能够使用 cmake 求解对符号的未定义引用
- 为什么以及在何处在C++中使用引用和指针
- boost::shared_ptr引用计数所做的是求解tr1::shared_pt的原始指针
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定