如何用向量表示圆
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用向量表示圆相关的知识,希望对你有一定的参考价值。
参考技术A |OA|=|OB|=|OC|=|OD| 即是四个向量的模相等则A、B、C、D在以O为圆心的圆上。追问
问得不是四点共圆
如何用非平凡的初始值填充向量?
【中文标题】如何用非平凡的初始值填充向量?【英文标题】:How to fill a vector with non-trivial initial values? 【发布时间】:2008-10-16 08:25:41 【问题描述】:我知道如何用非平凡的初始值填充 std::vector,例如序号:
void IndexArray( unsigned int length, std::vector<unsigned int>& v )
v.resize(length);
for ( unsigned int i = 0; i < length; ++i )
v[i] = i;
但这是一个 for 循环。有没有一种优雅的方法可以使用 stl 功能(并且不使用 Boost)减少代码行数?
【问题讨论】:
【参考方案1】:您可以使用 generate 算法来获得更通用的填充容器的方法:
#include <iostream>
#include <algorithm>
#include <vector>
struct c_unique
int current;
c_unique() current=0;
int operator()() return ++current;
UniqueNumber;
int main ()
vector<int> myvector (8);
generate (myvector.begin(), myvector.end(), UniqueNumber);
cout << "\nmyvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
这是从cplusplusreference无耻地提取和编辑的。
【讨论】:
他可能想以 v[i] == i 开头,但稍后在代码中更改。 是的,我希望他能解释一下这个案子。可能有比先填满 em 更好的方法。像一种懒惰的评估方式或其他方式。 我的问题更笼统,因为问题实际上是关于使用非平凡值进行初始化。我确实想用索引号填充数组,以便以后能够排列它们。可能还会有其他解决方案。 正确,已删除问题。也许您可以发布该排列问题?解决方案可能很有趣:) @moog 注意:generate 可能会制作一个 copy 或您提供的函数的副本,此代码可能会生成序列“1 1 1 1 ..”。相反,使用 tr1::ref 传递引用 UniqueNumber 的引用包装器,以避免复制: generate(.. tr1::ref(UniqueNumber) );【参考方案2】:我通常使用std::generate
加上一个简单的生成器:
template <typename T>
struct gen
T x;
gen(T seed) : x(seed)
T operator ()() return x++;
;
generate(a.begin(), a.end(), gen<int>(0));
【讨论】:
【参考方案3】:如果您使用的是 SGI STL(或衍生产品,例如 STLPort),您可以使用iota
。 :-)
void IndexArray(unsigned int length, vector<unsigned int>& v)
vector<unsigned int>(length).swap(v);
iota(v.begin(), v.end(), 0);
【讨论】:
c++11中也有【参考方案4】:adobe.ASL 中还有一个 iota()
函数(还有一个 value_iterator)。
在 boost 中,有一个 counting_iterator,我怀疑还有其他一些方法可以在 boost 中动态生成数字序列。
【讨论】:
【参考方案5】:我知道这已经得到解答,但我更喜欢算法库中的“填充”功能,因为它对我来说阅读起来更直观:
// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main ()
vector<int> myvector (8); // myvector: 0 0 0 0 0 0 0 0
fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0
fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0
cout << "myvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
这也被cplusplusreference无耻地解除了。
【讨论】:
您将如何使用它来按照要求用渐进式数字填充向量?【参考方案6】:如果你有一个 C 风格的数组,你可以使用 std:copy,例如,
int c_array[] = 3,4,5;
const int* pbegin = &c_array[0];
const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
const int* pend = pbegin + c_array_size;
std::vector<int> v;
v.reserve(c_array_size);
std::copy(pbegin, pend, std:back_inserter(v));
【讨论】:
以上是关于如何用向量表示圆的主要内容,如果未能解决你的问题,请参考以下文章