配列の絶対和を見つけようとしていました。
#include <iostream>
#include <vector>
using namespace std;
int getAbsSum(vector<int> arr) {
int result = 0;
for (int i = 0; i < arr.size(); i++)
{
result += abs(arr[i]);
}
return result;
}
int main() {
cout << getAbsSum([3, 2, -3, -4]);
return 0;
}
しかし、メイン関数に「識別子が必要です」というエラーが表示されました。このように、配列の前に型名を追加してみました
cout << getAbsSum(int [3, 2, -3, -4]);
しかし、それは機能しませんでした。
の意味は[ ]
、あなたがあなたの例で伝えるものではありません。[]は配列インデックスを示すために使用され、1つの引数のみをサポートします。したがって、3, 2, -3, -4
このコンテキストでの式は、3を評価し、次に2を評価し、次に-3を評価し、次に-4を評価し、-4を評価した結果を返すことを意味します。見る
https://en.cppreference.com/w/cpp/language/operator_other
式のため3
、2
そして-3
副作用がないあなただけ書いたかのように、ここでの結果は同じです-4
。識別子エラーを予期することに関して、operator [ ]
はその前に変数を必要とするのでarr[1]
、配列(またはコンテナ)arrの2番目のオブジェクトを返すことを意味します。解決策は、統一初期化の形式であるリスト初期化に正しい構文を使用することです(集約用の集約初期化と混同しないでください。ベクトルは集約ではありません)。
cout << getAbsSum({3, 2, -3, -4});
また、using namespace std;
グローバルワークスペースでは使用せず、スコープ内、つまり効果がスコープ内で制限されている関数内でのみ使用することをお勧めします。この関数の最新バージョンは、次のように書き直すことができます。
#include <iostream>
#include <vector>
#include <chrono>
template <typename E = int,
template <typename> typename T = std::vector>
E getAbsSum(T<E> const& arr){
E result {};
for (E element : arr)
{
result += abs(element);
}
return result;
}
int main() {
using namespace std;
using namespace std::literals;
cout << getAbsSum({3, 2, -3, -4}) << '\n';
cout << getAbsSum(vector<double>{2.3, 4.5, 6}) << '\n';
cout << getAbsSum(vector<chrono::seconds>{10s, 1min}).count() << '\n';
return 0;
}
このバージョンは、任意の算術型と任意のコンテナーをサポートします。
@foodiecookiesへの応答:
(1)ここで、この行E result {};
は、Eのデフォルトコンストラクターが呼び出されることを意味します。を使用した場合、のE result = 0
初期化でエラーが発生しますがchrono::seconds
、を使用した場合E result
、算術型は初期化されません。これは未定義の動作です。E result {}
複合型ではデフォルトのコンストラクターを呼び出し、基本型では0または同等の値(0.f、0.、false、...)を呼び出します。
(2)for (auto var : container)
は範囲ベースのループです。https://en.cppreference.com/w/cpp/language/range-forを参照してください。より安全で読みやすいと考えられています。for(;;)
コンテナ内のすべての要素を反復処理しない場合は、古いものを使用してください。
(ボーナス)引数依存ルックアップのおかげで関数のabs(element)
正しいバージョンを見つけるhttps://en.cppreference.com/w/cpp/language/adlabs
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加